一、webservice接口介绍
Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。
简单的说,WebService就是一种跨编程语言和跨操作系统平台的远程调用技术。跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。 远程调用,就是一台计算机的应用可以调用其他计算机上的应用。例如:支付宝,支付宝并没有银行卡等数据,它只是去调用银行提供的接口来获得数据。还有天气预报等,也是气象局把自己的系统服务以webservice服务的形式暴露出来,让第三方网站和程序可以调用这些服务功能。
本次项目是接入污水厂设备采集的数据,对接人售后技术员(非开发人员)给的接口文档很粗糙,没有清晰说明的话看的不是很明白。同时作为第一次接触webservice接口的菜鸟我来说看着wsdl更是一脸懵逼,所以还是百度大法好啊,记录一下处理过程:
第一步首先使用postman工具调试接口
查阅相关文章经过一顿捯饬,相当“自信”的跟对方的说“你们接口调不通”,对方不懂代码,所以我收获一张对方调试的图片:
事实证明若不是这张图片,body里面的参数设置是wsdl文档中也无法看出来的。最终经过与文档对比,最终设置成功:
POST请求,Headers中添加Content-Type:text/html,Body里面raw中的xml格式
<?xml version="1.0" ?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:impl="http://impl.*****.zeei.com.cn/">
<soapenv:Header/>
<soapenv:Body>
<impl:wsExecute>
<arg0>datadd</arg0>
<arg1>{、、、参数、、、,endtime:'2021-6-7'}</arg1>
</impl:wsExecute>
</soapenv:Body>
</soapenv:Envelope>
第二步如何在java中调用外部的webservice接口
导入依赖(版本仅供参考):
<!--webservice接口调用-->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.1.6</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.1.6</version>
</dependency>
<!-- 需要使用到JSONObject与JSONArray -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
java代码如下所示:
public JSONObject test(String arg0, String arg1, String info){
log.info(info + "拉取数据====================wsExecute方法调用开始");
//调用接口中方法wsExecute,两个参数arg0和arg1需要传入
String method = "wsExecute";
JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance();
//webservice接口IP地址
Client client = clientFactory.createClient("http://110.*****.1/DataService?wsdl");
JSONObject obj = new JSONObject();
Object[] result = new Object[0];
String pointcode = "{pointcode:'" + arg1 +"'}";
try {
// webservice中的方法;arg0是接口方法;pointcode是接口文档要传入的参数
result = client.invoke(method, arg0, pointcode);
obj = JSONObject.parseObject((String)result[0]);
} catch (Exception e) {
e.printStackTrace();
log.error(info + "获取失败");
}
log.info(info + "拉取数据====================wsExecute方法调用结束");
return obj;
}
第三步数据处理过程的方法
查看JSONObject、JSONArray源码:
public class JSONObject extends JSON implements Map<String, Object>, Cloneable, Serializable, InvocationHandler {...
public class JSONArray extends JSON implements List<Object>, Cloneable, RandomAccess, Serializable {...
//数据处理
//获取结果
JSONObject obj = new JSONObject();
Object[] resulet = client.invoke(method, arg0, arg1);
obj = JSONObject.parseObject((String)resulet[0]);
//获取key中的value
JSONArray jsonArray = obj.getJSONArray("data");
JSONObject jsonObject = jsonArray.getJSONObject(i); //遍历获取
String val0 = jsonObject.get("POLLUTENAME").toString();