目录

今日说码

点滴记录中国代码进程

X

Java 调用 WebService 接口

前言

由于要对接其他系统的 WebService 接口,尝试了几种方案有一个可以调通,在这里记录一下尝试的几种方案。至于为什么有的方案调不通,我也不是很清楚。。。

JAX-WS调用

JAX-WS 是 Java API for XML Web Services 的缩写,是一种比较常见的调用 Webservice 接口的方式。

生成代码

使用 wsimport 工具生成客户端代码,其中,<生成代码的目录> 是想要生成代码的目标目录,<WSDL文件的URL> 是 Web 服务的 WSDL 文件的 URL。

wsimport -s <生成代码的目录> <WSDL文件的URL>

调用方法

调用生成的代码中的方法,注意 YourWebServiceServiceYourWebServicePortTypeyourWebServiceMethodparameter 需要替换为生成的代码中的类和实际调用的方法及参数。

public class WebServiceClient {

    public static void main(String[] args) {
	// 创建客户端
        YourWebServiceService service = new YourWebServiceService();
        YourWebServicePortType port = service.getYourWebServicePort();

        // 调用 Web 服务方法
        String result = port.yourWebServiceMethod("parameter");

        // 处理结果
        System.out.println("Result: " + result);
    }
}

Jar包

如果有jar包问题,可引入相关依赖。

<dependency>
    <groupId>javax.xml.ws</groupId>
    <artifactId>javax.xml.ws-api</artifactId>
    <version>2.3.1</version>
</dependency>

手动创建WebService实例

如果不想使用使用 wsimport 工具生成代码,可以手动创建 WebService 实例,注意替换参数为实际值。

import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import java.net.URL;

public class YourWebServiceServiceClient {

    public static void main(String[] args) {
        try {
            // 1. 创建服务的 URL
            URL url = new URL("http://example.com/YourWebService?wsdl");

            // 2. 创建服务的 QName
            QName qname = new QName("http://example.com/", "YourWebServiceService");

            // 3. 创建服务
            Service service = Service.create(url, qname);

            // 4. 获取服务端口
            YourWebServicePortType port = service.getPort(YourWebServicePortType.class);

            // 5. 调用 Web 服务方法
            String result = port.yourWebServiceMethod("parameter");

            // 6. 处理结果
            System.out.println("Result: " + result);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

其中 YourWebServicePortType 示例如下:

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

@WebService(targetNamespace = "http://www.example.com/webservice", name = "YourWebService")
public interface YourWebServicePortType {
  
    @WebMethod(operationName = "yourWebServiceMethod")
    String yourWebServiceMethod(@WebParam(name = "parameter") String parameter);
}

Apache HttpClient调用

Apache HttpClient 是一个开源的 Java HTTP 客户端库,可以支持 HTTP 协议的客户端编程,其他的 HTTP 客户端也一样。

调用方法

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class HelloWorldClient {

    public static void main(String[] args) {
        StringEntity stringEntity = null;
        try {
            stringEntity = new StringEntity("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:imp=\"http://namespace.example.com/\">\n" +
                    "   <soapenv:Header/>\n" +
                    "   <soapenv:Body>\n" +
                    "      <imp:methodName>\n" +
                    "         <arg0>arg0</arg0>\n" +
                    "      </imp:methodName>\n" +
                    "   </soapenv:Body>\n" +
                    "</soapenv:Envelope>");
        } catch (Exception e) {
            e.printStackTrace();
        }

        HttpPost httpPost = new HttpPost("http://example.com/YourWebService?wsdl");
        httpPost.setHeader("Content-type", "text/xml;charset=UTF-8");
        httpPost.setEntity(stringEntity);

        try (CloseableHttpClient httpclient = HttpClients.createDefault(); CloseableHttpResponse response = httpclient.execute(httpPost)) {
            HttpEntity entity = response.getEntity();
            String result = EntityUtils.toString(entity, "UTF-8");
            System.out.println(result);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

StringEntity 的内容根据实际情况进行替换,如果使用 SoapUI 工具,可以直接从工具中复制参数。注意将方法名和参数进行替换。

image.png

Jar包

如果有jar包问题,可引入相关依赖。

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.10</version>
</dependency>

Apache CXF调用

Apache CXF 是一个开源的 Web 服务框架,支持 JAX-WS 和 JAX-RS 标准,可以用于调用和创建Web服务。

调用方法

注意替换相应参数。

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

public class WebServiceClient {

    public static void main(String[] args) {
        // Web 服务的 WSDL 地址
        String wsdlURL = "http://example.com/YourWebService?wsdl";

        // 创建代理工厂
        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
        factory.setServiceClass(YourWebService.class);
        factory.setAddress(wsdlURL);

        // 创建 Web 服务代理
        YourWebService client = (YourWebService) factory.create();

        // 调用 Web 服务方法
        String result = client.yourWebServiceMethod("parameter");

        // 处理响应
        System.out.println("Result: " + result);
    }
}

其中 YourWebService 示例如下:

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

@WebService(targetNamespace = "http://www.example.com/webservice", name = "YourWebService")
public interface YourWebService {

    @WebMethod(operationName = "yourWebServiceMethod")
    String yourWebServiceMethod(@WebParam(name = "parameter") String parameter);
}

也可以使用 wsdl2java 工具生成:

wsdl2java -d /path/to/output/directory -p com.example.client http://example.com/YourWebService?wsdl

会在指定的目录 /path/to/output/directory 中生成 Java 类,其中包括 com.example.client 包路径下的类文件。

配置日志(可选)

src/main/resources 目录下创建一个 logging.properties 文件,添加以下内容:

org.apache.cxf.Logger=org.apache.cxf.common.logging.Slf4jLogger

在应用程序的启动代码中添加以下代码:

import org.apache.cxf.common.logging.LogUtils;
import java.util.logging.ConsoleHandler;

public class WebServiceClient {

    static {
        // 配置 CXF 的日志
        LogUtils.setLoggerClass(org.apache.cxf.common.logging.Slf4jLogger.class);
        LogUtils.setUseParentHandlers(false);
        java.util.logging.Logger.getLogger("org.apache.cxf").setUseParentHandlers(false);
        ConsoleHandler consoleHandler = new ConsoleHandler();
        consoleHandler.setLevel(java.util.logging.Level.ALL);
        java.util.logging.Logger.getLogger("org.apache.cxf").addHandler(consoleHandler);
    }

    public static void main(String[] args) {
        // ...
    }
}

Jar包

如果有jar包问题,可引入相关依赖。

<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-core</artifactId>
    <<version>3.4.6</version>
</dependency>

<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxws</artifactId>
    <version>3.4.6</version>
</dependency>

Axis调用

参考Axis 调用 WebService 接口 - 今日说码 (96xl.top)

Hutool SoapClient调用

参考Soap客户端-SoapClient | Hutool


标题:Java 调用 WebService 接口
作者:96XL
地址:https://solo.96xl.top/articles/2023/11/15/1700018988054.html