一、创建Soap
代码示例如下:
@Test
public void createSoap() throws Exception{
// 创建消息工厂
MessageFactory factory = MessageFactory.newInstance();
// 通过工厂创建Soap的消息
SOAPMessage message = factory.createMessage();
// 获取SoapPart
SOAPPart part = message.getSOAPPart();
// 获取Soap信封Envelope
SOAPEnvelope envelope = part.getEnvelope();
// 通过Soap信封获取body和header的信息
SOAPBody body = envelope.getBody();
// 根据QName创建相应的节点(QName就是一个带有命名空间的节点:<ns:add xmls="http://www.xilen.com/webservice"/> )
QName qname = new QName("http://webservice.xilen.com", "add", "ns");
//通过soapBody传入QName添加body元素
SOAPBodyElement bodyElement = body.addBodyElement(qname);
// 对body添加子元素 (或者直接对body元素设置值:bodyElement.setValue("5"); )
SOAPElement childElement = bodyElement.addChildElement("a");
// 对body子元素设置值
childElement.setValue("7");
// 继续添加第二个子元素 (或者继续对子元素添加子元素:childElement.addChildElement("acn").setValue("acv");)
bodyElement.addChildElement("b").setValue("5");
// 打印最终得到的Soap消息
message.writeTo(System.out);
}
得到的Soap消息如下:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<ns:add xmlns:ns="http://webservice.xilen.com">
<a>7</a>
<b>5</b>
</ns:add>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
二、发送Soap消息
1、基于MESSAGE的方式
代码示例如下:
@Test
public void sendSoapByMessage() throws Exception{
/**
* 定义相关变量(wsdl文档的路径、接口的命名空间、实现的命名空间)
*/
String wsdlUrl = "http://localhost:8888/user?wsdl";
String implNS = "http://impl.soap.xilen.com/";
String inteNS = "http://soap.xilen.com/";
/**
* 创建服务
*/
URL url = new URL(wsdlUrl);
// 通过wsdl实现部分的命名空间创建服务的QNane,因为Service的描述在实现部分的命名空间中(详见 六、附录 中的截图)
QName serviceQname = new QName(implNS, "UserServiceImplService");
Service service = Service.create(url, serviceQname);
/**
* 创建Dispatch (通过SOAPMessage传递)
*/
Dispatch<SOAPMessage> dispatch =
// portName:wsdl文件中Service节点中的prot的name属性值的QName; type:消息类型; mode:消息传递的类型(message|payLoad)
service.createDispatch(new QName(implNS, "UserServiceImplPort"), SOAPMessage.class, Service.Mode.MESSAGE);
/**
* 创建SoapMessage
*/
SOAPMessage message = MessageFactory.newInstance().createMessage();
SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
SOAPBody body = envelope.getBody();
// 通过wsdl接口部分的命名空间创建消息的QNane,因为Message的描述在接口部分的命名空间中<span style="font-family: Arial, Helvetica, sans-serif;">(详见 六、附录 中的截图)</span>
QName soapQname = new QName(inteNS, "login", "ns");
SOAPBodyElement bodyElement = body.addBodyElement(soapQname);
bodyElement.addChildElement("name").setValue("admin");
bodyElement.addChildElement("pass").setValue("12345");
/**
* 输出即将发