目录

今日说码

点滴记录中国代码进程

X

Axis 调用 WebService 接口

前言

最近需要对接另一个系统提供的 WebService 接口,在网上查了很多种方法都不行,这里记录一下我使用的方法,仅供大家参考。注意我这里使用的是 Axis 而不是 Axis2,可能是提供的 WebService 接口版本太老了,我使用 Axis2 也无法调用。

实现

引入 Maven

<!-- Axis 调用 WebService 接口 Start -->
<dependency>
    <groupId>org.apache.axis</groupId>
    <artifactId>axis</artifactId>
    <version>1.4</version>
</dependency>

<dependency>
    <groupId>javax.xml.rpc</groupId>
    <artifactId>javax.xml.rpc-api</artifactId>
    <version>1.1.1</version>
</dependency>

<dependency>
    <groupId>org.apache.geronimo.bundles</groupId>
    <artifactId>commons-discovery</artifactId>
    <version>0.4_1</version>
</dependency>
<!-- Axis 调用 WebService 接口 End -->

三个包都必须引入,不然会报错。

代码

import cn.hutool.json.JSONUtil;
import com.lianyi.hportal.api.util.XmlUtil;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;

import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import java.net.URL;

@Slf4j
public class WebServiceUtil {

    private final static String URL = "http://ip:port/WebService/WebServiceSOAP2.asmx";

    private final static String AUTH_KEY = "123";

    /**
     * 发送请求
     *
     * @param localPart 接口名
     * @param desc      接口描述
     * @param params    请求参数
     * @param rClass    响应实体
     * @return R
     */
    @SneakyThrows
    private static <Q, R> R request(String localPart, String desc, Q params, Class<R> rClass) {
        String namespaceUrl = "XXX";

        // 转换为xml
        String requestXml = XmlUtil.beanToXML(params);
        log.info("WebService-{}接口请求参数为:{}", desc, requestXml);

        Service service = new Service();
        Call call = (Call) service.createCall();
        call.setTimeout(30000);
        call.setTargetEndpointAddress(new URL(URL));
        call.setSOAPActionURI(namespaceUrl + localPart);
        // 设置操作的名称
        call.setOperationName(new QName(namespaceUrl, localPart));
        // 设置返回的数据类型
        call.setReturnType(XMLType.XSD_STRING);
        // 设置参数
        call.addParameter(new QName(namespaceUrl, "authkey"), XMLType.XSD_STRING, ParameterMode.IN);
        call.addParameter(new QName(namespaceUrl, "Request_Xml"), XMLType.XSD_STRING, ParameterMode.IN);
        // 执行调用(Object 数组里面是参数, 需要和 addParameter 的顺序保持一致)
        String responseXml = (String) call.invoke(new Object[]{AUTH_KEY, requestXml});
        // 解析
        log.info("HisWebService-{}接口请求成功,响应参数为:{}", desc, responseXml);
        return JSONUtil.xmlToJson(responseXml).getJSONObject("Response").toBean(rClass);
    }
}

出入参按照接口要求来传,代码仅供参考。


标题:Axis 调用 WebService 接口
作者:96XL
地址:https://solo.96xl.top/articles/2023/07/31/1690771385787.html