1 前言
今儿, 要与外部系统进行对接, 在这过程中, 莫名地出现了具有两个 的接口这种情况, 心里很是纳闷。仔细琢磨了一会儿, 决定动手梳理梳理, 来捋捋。
首先看下什么是 呢?
有一种技术, 它是基于网络的, 这种技术能让不同的应用程序于互联网上相互通信。具体来讲, 它是一种基于标准化协议以及格式的应用程序接口, 也就是API, 它借助XML和HTTP去开展通信。它能够用来在不一样的平台以及编程语言之间传输数据, 进而让应用程序之间的集成变得更易于实现。比如说, 运行在Java平台上的一个应用程序能够通过该接口向运行在.NET平台上的一个应用程序发送请求, 并且接收响应。简短来说, 有一套规范被定义出来, 这规范是关于传输数据格式的, 然而通信用的通信协议依然是 HTTP , 所以, 调用接口这件事, 其本质实际上还是调用 HTTP 接口, 只要把对应的参数按照规范正确地传递就行。
简单来讲, 我的认知是这样的: 网络协议所运用的依旧是HTTP, 只不过请求的那部分内容以及返回的部分全都是XML格式的, 而XML格式又是依照某种规范规则的样式来呈现的。
那么, 要进行对接, 首先, 就是要向对方索要他们的WSDL地址。
2 获取接口描述文件:WSDL
WSDL 说 的接口描述文件。具体来说:
Web服务描述语言(Web)的缩写是WSDL, 它是一种基于XML的语言, 用于描述Web服务的接口, 用于描述Web服务的方法, 用于描述Web服务的数据类型, WSDL文件通常包含一个或多个服务定义, 每个服务定义描述了一个或多个相关的操作, 每个服务定义描述了这些操作接受的消息的格式, 每个服务定义描述了这些操作返回的消息的格式, WSDL文件还可以描述Web服务的地址, WSDL文件还可以描述Web服务的协议, WSDL文件还可以描述Web服务的传输机制等信息。通过运用WSDL文件, 开发人员能够清晰知晓Web服务的接口, 还能清楚明了其方法, 进而在多样的平台以及不同的编程语言之间开展通信以及进行集成。
通常情况下, 能够获取接口描述文件借助的方式是访问地址加上问号以及WSDL, 举例来说, 像是8082这个端口号下的web路径再加上斜杠以及问号和WSDL, 所得到的响应内容大致呈现出这样的情况。
其中:
为了指定那个包含该WSDL的XML命名空间的URL, 它对WSDL里所包含的全部类型、元素以及消息定义出全局唯一的命名空间。xfire.sap..wms当中的xfire是属于一个实现框架。其中name属性值是请求名称跟请求方法。该接口准许有多个方法。这次请求方法的名称是这个。标签里xsd: name="in0", 允许存在多个参数。这次请求参数的名称为in0。3在这个当中进行调用。
下载地址:
(1)打开软件是这样的:
(2)紧接着, 去点击SOAP这一选项之处, 将你的WSDL地址予以粘贴处理, 随后再去点击OK这个按钮。
(3) 首先, SOAP 会执行识别动作, 针对你的 WSDL 来进行, 继而呈现出全有的请求, 就是这样。
(4)发送请求:
SOAP 软件助力我们调试接口, 此即为该情况, 能将其请求与返回皆视作 XML 格式, HTTP 便是其网络协议哟。
4 在 中调用
历经上边 SOAP 的请求流程, 那咱们能够同样做到, 把请求的路径给予赋值, 还有参数也赋值, 将其赋予到咱们的:
5 在 Java 中调用
上面全都是借助工具, 那我们于代码范围之内要怎样去开展呢, 实际上就是去发送一回 HTTP 请求了, 只是请求参数得传递 XML 格式, 结果的解析同样是 XML。
importcn.hutool.http.HttpUtil;importcn.hutool.json.JSONObject;importcn.hutool.json.XML;importcom.alibaba.fastjson.JSON;importcom.bitsun.core.common.util.StringUtils;importlombok.extern.slf4j.Slf4j;importorg.apache.groovy.util.Maps;importorg.springframework.stereotype.Component;importjava.util.Map;/***@author: kuku * @description*/@Slf4j @ComponentpublicclassU8cWebServiceUtils {publicString send(String data) { String response= HttpUtil.createPost("http://192.168.118.121:8087/uapws/service/nc.itf.qtnyingtong.QtnYingtongService")//请求内容格式 必须设置哦.header("Content-Type", "text/xml")//将参数封装成 XML 内容.body(getXML(data)) .execute().body();if(StringUtils.isBlank(response)) {thrownewRuntimeException("webservice响应结果为空"); } String result;try{ JSONObject responseJson=XML.toJSONObject(response); result= responseJson.getJSONObject("soap:Envelope").getJSONObject("soap:Body") .getJSONObject("ns1:saveDateResponse").get("return", String.class); }catch(Exception e) {thrownewRuntimeException("webservice响应结果解析异常:" +e.getMessage()); }if(StringUtils.isBlank(result)) {thrownewRuntimeException("webservice响应结果result为空"); }returnresult; }/*** 组织数据,将数据拼接一下 *@paramdata *@return*/publicstaticString getXML(String data){ String soapXML= "\n" +"" +"" +""//webservice接口方法名+ ""+data+""//webservice接口参数名+"" +"" +"";returnsoapXML; }/*** 接口 *@return*/publicString sendAssembleItem() { Mapmap =Maps.of("system", "ctj","params1", "1","params2", "2"); String res=send(JSON.toJSONString(map));returnres; }publicstaticvoidmain(String[] args) { U8cWebServiceUtils u8cWebServiceUtils=newU8cWebServiceUtils(); System.out.println(u8cWebServiceUtils.sendAssembleItem()); } }
上头仅仅是个简易的样本, 当中有两个关键要素也就是, 要把请求参数包装成 XML 样式的, XML 内部的方法名称得跟你那 WSDL 里所界定的保持一致, 可要记着去改。
另外还有一个要点, 那便是关于请求返回的 XML 的值的获取, 在我这里所采用的是其中的一个工具哦。
JSONObject responseJson = XML.toJSONObject(response);
这样去获取的。
6 怎么串联 JSON
实际上, 我上面所举的例子之中, 请求参数里标签的内容呈现为JSON格式, 这意味着双方预先达成约定, 要在的XML内容里放置JSON串, 事实上最外层依旧是XML, 只是其中标签的内容,请求以及返回均为json, 随后双方获取其中的JSON内容, 并展开处理。
7 小结
行了, 有关 的进程至此为止, 要是存在理解有误的地方, 欢迎予以指出。