【工具使用】【WebService】WebService 是什么以及如何调试、如何对接开发
1 前言
今儿对接外部系统,莫名的有两个 WebService 的接口,很是纳闷。琢磨了会儿,来捋捋。
首先看下什么是 WebService 呢?
WebService 是一种基于网络的技术,它允许不同的应用程序在互联网上相互通信。具体来说,WebService 是一种基于标准化协议和格式的应用程序接口(API),它使用 XML 和 HTTP 来进行通信。WebService 可以用于在不同的平台和编程语言之间传输数据,从而使应用程序之间的集成更加容易。例如,一个运行在 Java 平台上的应用程序可以通过 WebService 接口向一个运行在.NET 平台上的应用程序发送请求,并接收响应。简而言之, WebSocket 定义了一套传输数据格式的规范,通信协议还是用的 HTTP。因此,调用 WebService 接口 本质还是调用 HTTP 接口,只要把参数按规范传对即可。
说白了我的理解就是:网络协议使用的还是 HTTP,只是请求的内容以及返回都是 XML格式的(XML格式又是按某种规范规则的形式)。
那么要对接一个 WebService 首先就是要跟对方要他们的 WSDL 地址。
2 获取接口描述文件:WSDL
WSDL 说 WebService 的接口描述文件。具体来说:
WSDL是 Web 服务描述语言(Web Services Description Language)的缩写。它是一种基于XML的语言,用于描述Web服务的接口、方法和数据类型。WSDL文件通常包含一个或多个服务定义,每个服务定义描述了一个或多个相关的操作,以及它们接受和返回的消息的格式。WSDL文件还可以描述Web服务的地址、协议和传输机制等信息。使用WSDL文件,开发人员可以明确了解Web服务的接口和方法,以便在不同的平台和编程语言之间进行通信和集成。
一般来说,获取接口描述文件可以通过访问 WebService地址?WSDL
。比如:http://localhost:8082/web/services/weater?WSDL
。响应的内容类似这样:
其中:
- tagetNamespace 用于指定包含该 WSDL 的 XML 命名空间的 URL。它定义了 WSDL 中包含的所有类型、元素和消息的全局唯一命名空间。 xfire.sap.webservice.wms 中的 xfire是webservice的一个实现框架。
- <xsd:element name="saveDataInfo"> 中 name 属性值为请求名称和请求方法。接口允许多个方法。本次请求方法名称: saveDataInfo。
- 标签中 xsd:complexType name="in0",允许有多个参数。本次请求参数名称: in0。
3 在 SOAPUI 中调用 WebService
下载地址:https://onebox.51xiazai.cn/soft/989454.htm
(1)打开软件是这样的:
(2)然后点击 SOAP,粘贴你的 WSDL 地址,然后点击 OK。
(3) SOAP 就会识别出你的 WSDL,并显示出所有的请求:
(4)发送请求:
这就是 SOAP 软件帮助我们调试 webService接口,可以看到它的请求和返回都是 XML 格式,网络协议就是 HTTP哈。
4 在 Postman 中调用 WebService
经过上边的 SOAP 的请求过程,那我们用 Postman 同样可以,我们把请求的路径以及参数赋值一份到我们的 Postman :
5 在 Java 中调用 WebService
上边都是用工具,那么我们在代码中如何去做,其实就是发送一次 HTTP 请求了,只不过请求参数需要传 XML格式,结果的解析也是 XML:
import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.XML; import com.alibaba.fastjson.JSON; import com.bitsun.core.common.util.StringUtils; import lombok.extern.slf4j.Slf4j; import org.apache.groovy.util.Maps; import org.springframework.stereotype.Component; import java.util.Map; /** * @author: kuku * @description */ @Slf4j @Component public class U8cWebServiceUtils { public String 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)) { throw new RuntimeException("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) { throw new RuntimeException("webservice响应结果解析异常:" + e.getMessage()); } if (StringUtils.isBlank(result)) { throw new RuntimeException("webservice响应结果result为空"); } return result; } /** * 组织数据,将数据拼接一下 * @param data * @return */ public static String getXML(String data){ String soapXML = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:qtn=\"http://qtnyingtong.itf.nc/QtnYingtongService\">\n" +"<soapenv:Header/>" +"<soapenv:Body>" +"<qtn:saveDate>" //webservice接口方法名 + "<string>"+data+"</string>" //webservice接口参数名 +"</qtn:saveDate>" +"</soapenv:Body>" +"</soapenv:Envelope>"; return soapXML; } /** * 接口 * @return */ public String sendAssembleItem() { Map<String, String> map = Maps.of( "system", "ctj" , "params1", "1" , "params2", "2" ); String res = send(JSON.toJSONString(map)); return res; } public static void main(String[] args) { U8cWebServiceUtils u8cWebServiceUtils = new U8cWebServiceUtils(); System.out.println(u8cWebServiceUtils.sendAssembleItem()); } }
上边只是一个简单的示例,两个关键点就是 getXML,将请求参数封装成 XML 格式的,XML里的方法名要跟你的 WSDL 里定义的一样哈,记得改。
另一个点就是请求返回的 XML 的值的获取,我这里是用的 Huttol 里的一个工具哈,
JSONObject responseJson = XML.toJSONObject(response);
这样去获取的。
6 WebService 怎么串联 JSON
其实我上边的例子,请求参数里标签的内容就是 JSON格式的,也就是双方提前约定好,在 WebService 的XML内容里放 JSON串,其实最外层还是 XML,只不过里边的标签内容,请求和返回都是 json,然后双方获取里边的 JSON 内容,进行处理。
7 小结
好了,关于 WebService 的过程就到这里哈,有理解不对的地方欢迎指正哈。