测试SOAP
package com.chb.soap;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
import javax.xml.transform.Source;
import javax.xml.ws.Dispatch;
import javax.xml.ws.Service;
import org.junit.Test;
import org.w3c.dom.Document;
import com.chb.service.User;
/**
* 测试SOAP协议
*/
public class TestSOAP {
private String wsdlUrlStr = "http://localhost:9998/ns?wsdl";
private String targetNameSpace = "http://service.chb.com/";
@Test
public void testIn01() {//测试输入
try {
//1、创建消息工厂, 单例模式
MessageFactory factory = MessageFactory.newInstance();
//2、根据消息工厂创建SOAPmessage
SOAPMessage message = factory.createMessage();
//3、创建SOAPprot
SOAPPart part = message.getSOAPPart();
//4、获取信封Envelope
SOAPEnvelope envelope = part.getEnvelope();
//5、通过SOAPEnvolope 创建header, 以及body
SOAPBody body = envelope.getBody();
/*
* 6、根据QName创建相应的节点,(QName 就是一个带有命名空间的节点。)
*
*/
QName qName = new QName("http://service.chb.com/",
"add", //localPart
"q0"); //命名空间的前缀
//7.qname添加到body中
SOAPBodyElement ele = body.addBodyElement(qName);
//注意: 使用下面的方法会将转换为<,>
//body.addBodyElement(qName).setValue("2233");
//8、通过SOAPBodyElement 设置参数的值
ele.addChildElement("a").setValue("22");
ele.addChildElement("b").setValue("33");
//打印消息信息
message.writeTo(System.out);
} catch (SOAPException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
/**
* 基于message的方式, 处理消息。
*/
public void test02() {
try {
//1、创建服务(Service)
//1.1、创建URL ,
URL wsdlUrl = new URL(wsdlUrlStr);
//1.2、创建QName;
QName qName = new QName(targetNameSpace,
"MyServiceImplService"); //发布服务名称
Service service = Service.create(wsdlUrl, qName);
/**
*/
//2、创建Dispatch
QName portName = new QName(targetNameSpace, "MyServiceImplPort");
Dispatch dispatch = service.createDispatch(portName,
SOAPMessage.class,
Service.Mode.MESSAGE);//消息传递方式
//3、创建SOAPMessage
SOAPMessage message = MessageFactory.newInstance().createMessage();
SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();//获取信封
SOAPBody body = envelope.getBody();
//4、创建QName 来指定消息中传递数据
QName eleQName = new QName(targetNameSpace, "add", "q0");
SOAPElement ele = body.addBodyElement(eleQName);
//这个方式会将 转义 <, >
ele.addChildElement("a").setValue("22");
ele.addChildElement("b").setValue("33");
message.writeTo(System.out);//打印一下请求message
//5、通过Dispatch发送消息。
System.out.println("\n invoke.....");
SOAPMessage response = dispatch.invoke(message);
response.writeTo(System.out);
//6、获取响应message的参数。
Document doc = response.getSOAPBody().extractContentAsDocument();
String result = doc.getElementsByTagName("addResult").item(0).getTextContent();
System.out.println("\n" + result);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (SOAPException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test
/**
* 基于PAYLOAD 方式
*/
public void test03() {
try {
//1、创建服务(Service)
//1.1、创建URL ,
URL wsdlUrl = new URL(wsdlUrlStr);
//1.2、创建QName;
QName qName = new QName(targetNameSpace,
"MyServiceImplService"); //发布服务名称
Service service = Service.create(wsdlUrl, qName);
/**
*/
//2、创建Dispatch
QName portName = new QName(targetNameSpace, "MyServiceImplPort");
Dispatch dispatch = service.createDispatch(portName,
Source.class,
Service.Mode.PAYLOAD);//消息传递方式
//使用JAXB 根据用户的对象创建相应的xml
User user = new User(2, "zhaoer", "sdfwer");
JAXBContext jaxbContext = JAXBContext.newInstance(User.class);
jaxbContext.createMarshaller().marshal(user, System.out);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
1、添加一个对象User
package com.chb.service;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
public class TestClient {
public static void main(String[] args) throws MalformedURLException {
//根据提供URL, 访问指定接口
URL url = new URL("http://localhost:9998/ns?wsdl");
//QName qName = new QName(namespaceURI, localPart)
//targetNamespace="http://service.chb.com/" name="MyServiceImplService">
//根据wsdl获取namespaceURI, 以及localport
QName qName = new QName("http://service.chb.com/", "MyServiceImplService");
//创建服务
Service service = Service.create(url, qName);
//通过service来创建接口
IMyService iMyService = service.getPort(IMyService.class);
System.out.println(iMyService.add(12, 34));
}
}
3、契约优先