上篇博客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)不存在,请查证后重新输入!