请求SOAPMessage的组建
在使用 javax.xml.soap包来调用webservice的时候,需要你先组装一个完整的请求SOAPMessage,而各个方法的参数格式及层数又有可能是不固定的,因此写了一个工具类来组装请求SOAPMessage
假定方法需要的参数格式为:
<sa:req>
<sa:param3>100</sa:param3>
<sa:param4>男</sa:param4>
<sa:param1>lzp</sa:param1>
<sa:param2>
<sa:birthDay>20170801</sa:birthDay>
<sa:addr>杭州西湖</sa:addr>
</sa:param2>
</sa:req>
<sa:param>hahah1</sa:param>
像这种格式的入参一般已经算是比较复杂的了,一个req对象里面有三个基本对象,又有一个param2对象。像这种入参的组合SOAPMessage该如何组建呢?
参考了spring的组建对象思想,spring对复杂类型的组建,采用A.attribute来构建,如User.name来为User对象的name属性赋值。
- 参数Map的构建
使用一个map来构建输入的参数,map的key格式如下
Map<String,String> map = new HashMap<>();
map.put("req.param1","lzp");
map.put("req.param2.addr","杭州西湖");
map.put("req.param2.birthDay","20170801");
map.put("req.param3","100");
map.put("req.param4","男");
map.put("param","hahah1");
- 构建方法
//method:调用的方法名 params:参数map uri webservice命名空间,如果大家有需要可以把SOAPAction的值提到方法参数里去,因为有些并没有SOAPAction,此处只做测试
public static SOAPMessage buildSoap(String method, Map<String,String> params, String uri) throws SOAPException {
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage message = messageFactory.createMessage();
message.getMimeHeaders().setHeader("SOAPAction","http://WebXml.com.cn/getRegionDataset");
// 创建soap消息主体==========================================
SOAPPart soapPart = message.getSOAPPart();// 创建soap部分
SOAPEnvelope envelope = soapPart.getEnvelope();
SOAPBody body = envelope.getBody();
// 根据要传给mule的参数,创建消息body内容。具体参数的配置可以参照应用集成接口技术规范1.1版本
// =====================================
SOAPElement bodyElement = body.addChildElement(envelope.createName(
method, "sa", uri));
for (Map.Entry<String,String> entry:params.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
digui(bodyElement,key,value);
}
// Save the message
message.saveChanges();
//将构建的soap的xml打印出来 便于调试
//try {
// message.writeTo(System.out);
//} catch (IOException e) {
// e.printStackTrace();
//}
return message;
}
//递归调用判断key是否存在.号。组建SOAPElement
private static SOAPElement digui(SOAPElement element,String key,String value) throws SOAPException{
if (key.contains(".")){
String[] arr = key.split("\\.",2);
Iterator<SOAPElement> iterator = element.getChildElements();
Map<String,SOAPElement> childs = new HashMap<>();
while (iterator.hasNext()){
SOAPElement e = iterator.next();
childs.put(e.getLocalName(),e);
}
boolean flag = false;
for (Map.Entry<String,SOAPElement> entry:childs.entrySet()) {
if (entry.getKey().equals(arr[0])){
flag =true;
digui(entry.getValue(),arr[1],value);
}
}
if (!flag){
SOAPElement soapElement = element.addChildElement(arr[0],"sa");
digui(soapElement,arr[1],value);
}
}else {
element.addChildElement(key,"sa").addTextNode(value);
}
return element;
}
如图组建成功的SOAPMessage的xml为:
<?xml version="1.0" encoding="utf-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<sa:buildTest xmlns:sa="http://WebXml.com.cn/">
<sa:req>