zoukankan      html  css  js  c++  java
  • 手把手教你SOAP访问webservice并DOM解析返回的XML数据(转)

    http://blog.csdn.net/u012534831/article/details/51357111

    前言: 
    目前我们项目组还在采用webservice这种http方式,并且某些网站服务提供的对外接口还在采用webservice方式,因此就总结了一下写了这篇文章。

    以soap1.2的请求为例,在例子里我们传进去用户名和密码给服务,服务返回一个xml数据。 
    首先我们来开一下soap1.2的request,

    //wsdl,例:OrderApp.asmx
    POST /******App.asmx HTTP/1.1
    //这儿填写服务地址
    Host: 100.100.100.100
    Content-Type: application/soap+xml; charset=utf-8
    Content-Length: length
    
    <?xml version="1.0" encoding="utf-8"?>
    <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
      <soap12:Body>
        <Login xmlns="我的项目">
          <UserName>string</UserName>
          <PassWord>string</PassWord>
        </Login>
      </soap12:Body>
    </soap12:Envelope>

    接下来,我们在代码里拼接请求体:

    /**
     * arg1为第一个参数键,arg2为第一个参数值,arg3为第二个参数键,arg4为第二个参数值,
     *method为方法名,xmlns为命名空间 */
        public void initSoap(String arg1,String arg2,String arg3,String arg4,String method,String xmlns) {
            String soapRequestData = "<?xml version="1.0"       encoding="utf-8"?>"
                    + "<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance""
                    + " xmlns:xsd="http://www.w3.org/2001/XMLSchema""
                    + " xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">"
                    + " <soap12:Body>"
                    + "<"+method+""+"xmlns="+"""+xmlns+"""
    //                + " <Login xmlns="我的项目">"
                    + "<"+arg1+">"+arg2+"</"+arg1+">"
                    + "<"+arg3+">"+arg4+"</"+arg3+">"
    //                + " <UserName>"+"YQPIS0670"+"</UserName>"
    //                + " <PassWord>"+"YQPIS0670"+"</PassWord>"
                    + " </Login>" 
                    + "</soap12:Body>"
                    + " </soap12:Envelope>";
        }

    第二步,开启线程并执行访问

    new Thread(new Runnable() {
        @Override
        public void run() {
        // TODO Auto-generated method stub
        PostMethod postMethod = new PostMethod(
        "服务地址,即上面request中的host+端口号+post");
        // 然后把Soap请求数据添加到PostMethod中
        byte[] b = null;
        try {
        b = soapRequestData.getBytes("utf-8");
            } catch (UnsupportedEncodingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
            }
        InputStream is = new ByteArrayInputStream(b, 0, b.length);
        RequestEntity re = new InputStreamRequestEntity(is,
                b.length, "application/soap+xml; charset=utf-8");
        postMethod.setRequestEntity(re);
        // 最后生成一个HttpClient对象,并发出postMethod请求
        HttpClient httpClient = new HttpClient();
            try {
            int statusCode = httpClient.executeMethod(postMethod);
                if (statusCode == 200) {
                    Log.d("soapRequestData", "调用成功!");
                    StringBuffer buffer = new StringBuffer();
                    // 解析器 工厂类
                    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                    DocumentBuilder db = dbf.newDocumentBuilder();
                    //返回流式数据
                    InputStream soapResponseData = postMethod
                                .getResponseBodyAsStream();
                    Document dm = db.parse(soapResponseData);
                    // element和node是同一概念
                    // 不同的是element提供更多方法
                if (dm.getElementsByTagName("Root").item(0)
                    .getFirstChild() != null) {
                    // j是Root即根节点下面节点个数
                    for (int j = 0; j < dm  .getElementsByTagName("Root").item(0)
                               .getChildNodes().getLength(); j++) {
                   String result3 = dm.getElementsByTagName("Root")                                 .item(0).getChildNodes().item(j).getTextContent();
                    buffer.append(result3);
                  }
                }
             } else {
            Log.d("soapRequestData", "调用失败!错误码:" + statusCode);
            }
        } catch (HttpException e) {
        // TODO Auto-generated catch block
                e.printStackTrace();
        } catch (IOException e) {
        // TODO Auto-generated catch block
                e.printStackTrace();
        } catch (ParserConfigurationException e) {
        // TODO Auto-generated catch block
                e.printStackTrace();
        } catch (SAXException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
        }
      }
    }).start();

    大家可以看下我的xml数据:

    <Root>
    <Result>1</Result>
    <Message>登录成功</Message>
    <MemberIDCard>YQPIS0670</MemberIDCard>
    <UserName>祁宏涛</UserName>
    <Birthday>2010-11-04</Birthday>
    <Photo>...</Photo>
    <Telephone/>
    <MemberState>当前会员</MemberState>
    <MemberStatus>友情会籍</MemberStatus>
    <MemberSex>12ee640d-a037-497e-966e-91fc2186c8b4</MemberSex>
    <Nationality>175f0624-29d1-4b88-9d97-d72ebb1e6a1c</Nationality>
    <MemberSexMemo></MemberSexMemo>
    <NationalityMemo>中国</NationalityMemo>
    </Root>

    如果有多层节点,可以自己修改dm.getElementsByTagName(“Root”) .item(0).getChildNodes().item(j).getTextContent() 
    为dm.getElementsByTagName(“Root”) .item(0).getChildNodes().item(j).getChildNodes().item(k).getTextContent();即为3层节点的属性值。 

  • 相关阅读:
    【bzoj4596】[Shoi2016]黑暗前的幻想乡 容斥原理+矩阵树定理
    【bzoj4832】[Lydsy1704月赛]抵制克苏恩 期望dp
    【bzoj3796】Mushroom追妹纸 hash/sa+kmp+二分
    【bzoj3309】DZY Loves Math 莫比乌斯反演+线性筛
    【bzoj2813】 奇妙的Fibonacci数列 线性筛
    面向对象实现简单的学生课程选择
    小案例--面向对象中实现分页
    初识面向对象四(装饰器/反射)
    python小技巧--控制台输出带颜色的文字方法
    初识面向对象三(经典类/多态/鸭子类型/初识封装)
  • 原文地址:https://www.cnblogs.com/herizai/p/7122724.html
Copyright © 2011-2022 走看看