webservice接口三连击之third

上篇博客webservice接口三连击之second我们讲解了如何用soap ui 工具解析webservice接口,今天我们将介绍用java实现webservice接口的调用。

1.首先写了一个http的工具类,用来发送符合http协议的请求,代码如下:

package com.noblelift.imp.platform.core.util;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.io.InputStream;
import org.json.XML;
import net.sf.json.JSONObject;
 
/**
 * 后端调用第三方webservice接口
 * @author zds 2018-12-27 16:33:50
 *
 */
public class WebServiceUtil {
    /**
     * 
     * @param url 第三方系统提供webservice的接口url
     * @param method 第三方系统提供webservice对应的方法名
     * @param soapXML 第三方系统提供webservice对应的方法请求参数
     * @return 第三方系统返回的JSONObject调用结果
     * @throws Exception 工具类一般不处理具体异常,抛出由调用方处理,否则容易形成黑箱
     */
     public static JSONObject process(String url,String method, String soapXML) throws Exception{
         //构建返回值
        JSONObject result = new JSONObject();
         //第一步:创建服务地址  
        URL netUrl = new URL(url);  

        //第二步:打开一个通向服务地址的连接 
        HttpURLConnection connection = (HttpURLConnection) netUrl.openConnection();  

        //第三步:设置参数  
        connection.setRequestMethod("POST");  
         //设置超时时间
        connection.setConnectTimeout(50000);
        
        //3.2设置数据格式:content-type  
        connection.setRequestProperty("content-type", "text/xml;charset=utf-8");  

        //3.3设置输入输出,因为默认新创建的connection没有读写权限,  
        connection.setDoInput(true);  

        connection.setDoOutput(true);  
  

        //将信息以流的方式发送出去
        OutputStream os = connection.getOutputStream();  

        os.write(soapXML.getBytes());  

        //第五步:接收服务端响应,打印  

        int responseCode = connection.getResponseCode();  

        if(200 == responseCode){//表示服务端响应成功  

            //获取当前连接请求返回的数据流
            InputStream is = connection.getInputStream();  

            InputStreamReader isr = new InputStreamReader(is);  

            BufferedReader br = new BufferedReader(isr);  

            StringBuilder sb = new StringBuilder();  

            String temp = null;  

            while(null != (temp = br.readLine())){  
                sb.append(temp);  
            }  
           
           

            //打印结果

            String ret=sb.toString();
            if(ret.startsWith("<?"))
                ret = ret.replaceAll("\\<\\?.+\\?\\>", "<?xml version='1.0' encoding='UTF-8'?>");
            else
                ret = (new StringBuilder("<?xml version='1.0' encoding='UTF-8'?>")).append(ret).toString();
            
            String now = xml2jsonString(ret);
            System.out.println("打印返回结果转成jsonString-------------"+now);  
            result =JSONObject.fromObject(now);
            is.close();  
            isr.close();  
            br.close();  
            //关闭连接
            connection.disconnect();
        }
        os.close();
        return result;
     }

    
    /**
     * string转化成JSON
     * @param xml文件的string格式
     * @return
     * @throws Exception工具类一般不处理具体异常,抛出由调用方处理,否则容易形成黑箱
     */
    public static String xml2jsonString(String xml) throws Exception {
        org.json.JSONObject xmlJSONObj = XML.toJSONObject(xml);
        return xmlJSONObj.toString();
    }
    /**
     * 获得要发送的webservice的xml形式的参数
     * @param form查询条件
     * @return
     */
    private static String getXML(HashMap<String,String> form,String method){  
        StringBuffer sb = new StringBuffer();
        sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?> "); 
        sb.append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:web=\"http://webserviceTest/\">"); 
        sb.append("<soapenv:Header/>"); 
        sb.append("<soapenv:Body>"); 
        sb.append("<web:"+method+">"); 
        // 设置请求参数
        for(Iterator<String> it = form.keySet().iterator();it.hasNext();){
            String key = it.next();
            String value = form.get(key);
            sb.append("        <"+key+">"+value+"</"+key+">");
        }
        sb.append("</web:"+method+">"); 
        sb.append("</soapenv:Body>"); 
        sb.append("</soapenv:Envelope>");   
        System.out.println("getXML发送数据-----------------"+sb.toString());
        return sb.toString();  

    }  
      public static void main(String[] args) throws Exception {  
        String url = "http://192.168.81.137:8080/Service/ServiceHello";
            String method="loginTest";
            HashMap<String,String> form = new HashMap<String,String>();
            form.put("name", "admin");
            form.put("password", "123456");
            //组织SOAP数据,发送请求  
            String soapXML = getXML(form,method);  
        //非必填字段
          JSONObject ret  =  WebServiceUtil.process(url,method,soapXML);  
          JSONObject Envelope = ret.optJSONObject("S:Envelope");
          JSONObject Body = Envelope.optJSONObject("S:Body");
          JSONObject loginTestResponse = Body.optJSONObject("ns2:loginTestResponse");
          String Out = loginTestResponse.optString("return");
          System.out.println("例子:查询结果-----------------"+Out);
        }  
}

2.这里从mian方法开始介绍,第一行http请求的url,可以在soap UI工具页面看到,如下图:

上图的1处就是http请求url的路径,已经解析出来,main方法第二行method的值就是接口对应的方法名为loginTest,form就是需要传的参数的集合,组织好form后调用工具方法getXML(form,method)即可得到http请求的xml形式的参数, getXML工具方法的内容其实就是上图 2处的xml内容,到这里参数都组织完毕,直接调用写好的http工具方法WebServiceUtil.process(url,method,soapXML)即可,然后就会接收到服务端返回的信息,该返回值是个Json,就是上图3处的xml格式的数据,其中我们只需要取到return字段,具体的操作如main方法所示,到这里调用接口就完成了,值得注意的是getXML中组织的参数信息对于不同的接口需要特殊处理,可直接复制soap UI解析的xml参数信息(Soap UI是个强大的工具)。

4.main方法执行结果如下:

getXML发送数据-----------------<?xml version="1.0" encoding="utf-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webserviceTest/"><soapenv:Header/><soapenv:Body><web:loginTest>        <password>123456</password>        <name>admin</name></web:loginTest></soapenv:Body></soapenv:Envelope>
打印返回结果转成jsonString-------------{"S:Envelope":{"xmlns:S":"http://schemas.xmlsoap.org/soap/envelope/","S:Body":{"ns2:loginTestResponse":{"xmlns:ns2":"http://webserviceTest/","return":"账号(null)不存在,请查证后重新输入!"}}}}
例子:查询结果-----------------账号(null)不存在,请查证后重新输入!

猜你喜欢

转载自blog.csdn.net/u012880682/article/details/86358197