使用 Axis 调用 WebService 服务接口

2023/12/20 WebService

# 前言

项目中要使用第三方平台提供的服务,接口是以 SOAP WebService 的形式暴露的。因为是初次接触 WebService 技术,本文主要记录从学习 WebService 到项目成功接入服务的整个过程。学习过程中参考了几篇不错的博客。(WebService 目前很少使用,作为知识的额外补充,了解即可,不需要深入学习)

# 实现

实现过程:

  1. 参考 WebService 服务端提供的 WSDL 格式的文档,根据文档确定要调用的方法及参数。

  2. 选择接口调用方式。

    • 直接发送 HTTP 请求调用。

    • 根据 WSDL 文档生成 Client,通过 Client 调用。(IDEA 中提供了代码生成的方法,需要先安装 WebServcie 插件。)

    • 通过 Axis 方式调用。(Java 提供了相关的类库,引入相关依赖即可使用)

工作中 WebService 服务接口需要传递 XML 格式的参数,参数中包含了身份认证的信息。使用 Axis 方式调用比较方便

  1. 引入相关依赖,编写代码。

# 引入依赖

<!--  Axis 相关依赖      -->
<dependency>
    <groupId>org.apache.axis</groupId>
    <artifactId>axis</artifactId>
    <version>1.4</version>
</dependency>
<dependency>
    <groupId>org.apache.axis</groupId>
    <artifactId>axis-jaxrpc</artifactId>
    <version>1.4</version>
</dependency>
<dependency>
    <groupId>wsdl4j</groupId>
    <artifactId>wsdl4j</artifactId>
</dependency>
<dependency>
    <groupId>commons-discovery</groupId>
    <artifactId>commons-discovery</artifactId>
    <version>0.2</version>
</dependency>
<!--  dom4j 用来解析xml文件      -->
<dependency>
    <groupId>org.dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>2.1.4</version>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

# 代码实现

/**
 * 发送请求
 *
 * @param url	WSDL文档地址(示例:http://webservice?wsdl)
 * @param soapActionUrl	要调用的方法地址
 * @param namespace	    命名空间
 * @param method	    调用的方法名称
 * @param parameter	    调用的方法参数
 * 注:命名空间、方法地址、方法、方法参数根据实际情况调整(在提供的WSDL文件中查看)
*/
public void sendRequest(String url,String soapActionUrl, String namespace, String method,String parameter) throws Exception {
    Service service = new Service();
    Call call = (Call) service.createCall();
    // 请求地址
    call.setTargetEndpointAddress(url);
     // 请求地址
    call.setTargetEndpointAddress(new URL(url));
    call.setEncodingStyle("UTF-8");
    call.setUseSOAPAction(true);
    call.setSOAPActionURI(soapUrl);
    // 操作的方法
    call.setOperationName(new QName(namespace, method));
    // 方法参数
    call.addParameter(new QName(namespace,parameter), XMLType.XSD_STRING, ParameterMode.IN);
    // 返回结果类型
    call.setReturnType(XMLType.XSD_STRING);
    // 构造xml参数
    String str = makeXml();
    Object invoke = call.invoke(new Object[]{str});
    // 响应的结果
    String result = (String) invoke;
	// 根据响应结果写业务逻辑
    Document document = DocumentHelper.parseText(result);
    Element rootElement = document.getRootElement();
    Element resp = rootElement.element("Resp");	// 只能获取当前节点的下一节点
    String respCode = resp.element("RespCode").getTextTrim();
    if (!StrUtil.equals(respCode, "success")) {
        System.out.println("请求异常");
    } else {
        System.out.println("请求成功");
    }
}

/**
 * xml 参数构造方法(dom4j)
 * @return
*/
private String makeXml() {
    Document document = DocumentHelper.createDocument();
    Element contractRoot = document.addElement("ContractRoot");
    Element tcpCont = contractRoot.addElement("TcpCont");
    tcpCont.addElement("RequestTime").setText(DateUtil.now());

    Element bizCont = contractRoot.addElement("BizCont");
    bizCont.addElement("RequestTime").setText(DateUtil.now());

    return document.asXML();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

# 说明

  • WSDL 命名空间查看:在 WSDL 文档中找到targetNamespace标签
  • soapActionUrl 查看:在 WSDL 文档中找到soap:operation标签