webservice 调用以及SOAPMessage的组装与解析

本文详细介绍了如何使用Java的javax.xml.soap包来创建和解析SOAPMessage。首先,展示了如何构建复杂的请求SOAPMessage,利用Map构建参数,并提供了一种处理多层嵌套参数的方法。接着,讨论了响应SOAPMessage的解析,特别是处理XML的多层嵌套和同级多个同名元素节点的情况。最后,通过实例展示了从SOAPMessage转换为JSON的过程。
摘要由CSDN通过智能技术生成

请求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属性赋值。

  1. 参数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");
  1. 构建方法
//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>
        
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值