Java 客户端调用 WebService 接口的一种方式

Java 客户端调用 WebService 接口的一种方式

1. SoapUI 测试 webservice 接口

  通过SoapUI创建一个SOAP Project;
  项目名称自定义,WSDL地址维护WebService接口地址。点击OK即可

  项目创建完成后,展开WebService项,可以看到具体的接口,打开接口下的Request,右侧面板Form标签下可以清晰的看到请求入参,点击Submit请求按钮可以看到Overview标签下的响应结果。

  XML标签下的请求报文和响应报文

<!-- 请求报文 -->
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservice.qyythpt.jzkj.***">
   <soapenv:Header/>
   <soapenv:Body>
      <web:sendMessage>
         <!--Optional:-->
         
      <xmlStr>123456</xmlStr></web:sendMessage>
   </soapenv:Body>
</soapenv:Envelope>

<!-- 响应报文 -->
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <ns2:sendMessageResponse xmlns:ns2="http://webservice.qyythpt.jzkj.***">
         <String><![CDATA[<resident>1695087972825</resident>
<rescode>0</rescode>
<resmsg>数据处理错误!</resmsg>]]></String>
      </ns2:sendMessageResponse>
   </soap:Body>
</soap:Envelope>

2. java 访问 WebService 接口

  WebService 调用有多种方式,此处以 HttpURLConnection 调用为例。
  接口请求封装,仅需要传入接口需要的入参和接口地址。
  接口响应结果,解析成Map对象返回。如下所示

/**
     * WebService推送报文封装请求推送
     * WebService 接口地址为 http://{ip}:{port}/services/TraderService?wsdl
     * @param webServicePushUrl 此处 webServicePushUrl 为 http://{ip}:{port}/services/TraderService 
     * @param xmlStr 接口入参
     * @return
     */
    private Map<String, Object> webServicePush(String webServicePushUrl, String xmlStr) {
        Map<String, Object> resultMap = new HashMap<>(2);
        resultMap.put("code", "0");
        resultMap.put("msg", "推送失败!");

        InputStream is = null;
        InputStreamReader isr = null;
        BufferedReader br = null;
        OutputStream os = null;
        try {
            //第一步:创建服务地址,不是WSDL地址
            URL url = new URL(webServicePushUrl);
            //2:打开到服务地址的一个连接
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            //3:设置连接参数
            //3.1设置发送方式:POST必须大写
            connection.setRequestMethod("POST");
            //3.2设置数据格式:Content-type
            connection.setRequestProperty("content-type", "text/xml;charset=utf-8");
            //3.3设置输入输出,新创建的connection默认是没有读写权限的,
            connection.setDoInput(true);
            connection.setDoOutput(true);
            //4:组织SOAP协议数据,发送给服务端;报文参考SoapUI测试工具的XML请求报文
            String soapXML = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:web=\"http://webservice.qyythpt.jzkj.***\">" +
                    "<soapenv:Header/>" +
                    "<soapenv:Body>" +
                    "<web:sendMessage>" +
                    "<xmlStr><![CDATA[" +
                    xmlStr +
                    "]]></xmlStr></web:sendMessage>" +
                    "</soapenv:Body>" +
                    "</soapenv:Envelope>";
            logger.warn("[WebService]:推送请求{}", soapXML);
            os = connection.getOutputStream();
            os.write(soapXML.getBytes());
            //5:接收服务端的响应
            int responseCode = connection.getResponseCode();
            if(200 == responseCode){//表示服务端响应成功
                is = connection.getInputStream();
                isr = new InputStreamReader(is);
                br = new BufferedReader(isr);

                StringBuilder sb = new StringBuilder();
                String temp = null;
                while(null != (temp = br.readLine())){
                    sb.append(temp);
                }
                logger.warn("[WebService]:推送结果{}", sb);
                Map<String, Map> bodyMap = XmlUtils.xmlTOMap(sb.toString());
                Map<String, Map> sendMessageResponseMap = bodyMap.get("Body");
                Map<String, String> resultStringMap = sendMessageResponseMap.get("sendMessageResponse");
                String stringXML = resultStringMap.get("String");
                stringXML = "<root>" + stringXML + "</root>";
                Map<String, String> stringMap = XmlUtils.xmlTOMap(stringXML);
                // String -> <resident>1694505193442</resident><rescode>1</rescode><resmsg>ok</resmsg>
                // String -> <resident>1678862927956</resident><rescode>0</rescode><resmsg>数据处理错误!</resmsg>
                // 0失败,1成功
                resultMap.put("code", stringMap.get("rescode"));
                resultMap.put("msg", stringMap.get("resmsg"));
            }
        } catch (Exception e) {
            logger.error("[WebService]推送异常", e);
        } finally {
            if (null != is) {
                try {
                    is.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            if (null != isr) {
                try {
                    isr.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            if (null != br) {
                try {
                    br.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            if (null != os) {
                try {
                    os.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
        return resultMap;
    }

更多请求方式可参考文档调用webservice服务方式总结
Powered By niaonao

转载请说明出处内容投诉
CSS教程_站长资源网 » Java 客户端调用 WebService 接口的一种方式

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买