拿到SOAP请求的时候,先使用SOAPUI工具解析WSDL文件,得到请求方法列表,新建一个请求,SOAPUI查看协议版本和Action如下:
如下为解析出的XML入参示例。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="namespace">
<soapenv:Header/>
<soapenv:Body>
<web:method>
<!--Optional:-->
<param1></param1>
<!--Optional:-->
<param2></param2>
<!--Optional:-->
<param3></param3>
<!--Optional:-->
<param4></param4>
</web:method>
</soapenv:Body>
</soapenv:Envelope>
上述XML中 xmlns:web 此为web标签的命名空间,web:method 这里的method是示例,为方法名称。以上述入参为例,使用hutool包发出SOAP请求代码如下:
String result = SoapUtil.createClient(url, SoapProtocol.SOAP_1_1)
.header("SOAPAction", action)
.setMethod(method, namespace)
.setParam("param1", 1, false)
.setParam("param2", 2, false)
.setParam("param3", 3, false)
.setParam("param4", 4, false).send();
各参数含义:
- SoapProtocol.SOAP_1_1 为SOAP协议版本,在SOAPUI工具即可查看。
- action为请求Action,在SOAPUI工具即可查看。
- method为请求方法名,与入参xml里标签里方法名保持一致
- setParam的最后一个参数为false是在入参时不携带方法命名空间前缀,hutool中有中文注释,若 param1 标签为 web:param1,需要设置为true,带上前缀即可。
- soapenv:Header中若要设置参数,自行调用 addSOAPHeader() 方法。
请求后出参如下:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:method xmlns:ns2="namespace">
<return></return>
</ns2:method>
</soap:Body>
</soap:Envelope>
取return标签内容代码如下:
Document document = XmlUtil.parseXml(result);
NodeList nodeList = document.getElementsByTagName("return");
if (nodeList.getLength() > 0) {
Node returnNode = nodeList.item(0);
if (returnNode.getNodeType() == Node.ELEMENT_NODE) {
Element returnElement = (Element) returnNode;
String content = returnElement.getTextContent();
System.out.println(content);
}
}