【工具使用】【WebService】WebService 是什么以及如何调试、如何对接开发

发布时间 2024-01-11 07:15:41作者: 酷酷-

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。响应的内容类似这样:

其中:

  1. tagetNamespace 用于指定包含该 WSDL 的 XML 命名空间的 URL。它定义了 WSDL 中包含的所有类型、元素和消息的全局唯一命名空间。 xfire.sap.webservice.wms 中的 xfire是webservice的一个实现框架。
  2. <xsd:element name="saveDataInfo"> 中 name 属性值为请求名称和请求方法。接口允许多个方法。本次请求方法名称: saveDataInfo。
  3. 标签中 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 的过程就到这里哈,有理解不对的地方欢迎指正哈。