杰瑞科技汇

Java如何调用web service?

下面我将为你详细介绍三种主流的 Java 调用 Web Service 的方法,并附上详细的步骤和代码示例:

Java如何调用web service?-图1
(图片来源网络,侵删)
  1. JAX-WS (Java API for XML Web Services):这是 Java 官方标准的、最主流的方式,用于创建和调用基于 SOAP 协议的 Web Service,从 Java 6 开始,JAX-WS 就已经内置在 JDK 中了。
  2. Apache CXF:这是一个功能强大的、开源的 Web Service 框架,它既支持 SOAP,也支持 RESTful Web Service,它提供了更灵活的配置和更丰富的功能,是 JAX-WS 的一个优秀实现。
  3. OkHttp + Jackson/Gson:这种方式专门用于调用 RESTful Web Service,RESTful 通常使用 JSON 作为数据交换格式,而不是 SOAP 的 XML,这种方法在现代微服务架构中非常流行,因为它轻量、灵活。

场景设定

为了方便演示,我们将使用一个公共的、免费的 Web Service 作为示例:

  • 服务地址: http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx
  • 服务功能: 根据手机号码查询归属地。
  • WSDL 地址: http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
  • 我们要调用的方法: getMobileCodeInfo
  • 方法参数: mobileCode (手机号), userID (用户ID,我们传一个空字符串即可)

使用 JAX-WS (JDK 内置)

JAX-WS 的核心思想是“一切皆为 Java 对象”,它会根据 WSDL 文档自动生成一系列的 Java 代码(客户端存根),让你可以像调用本地方法一样调用远程的 Web Service。

步骤 1:获取 WSDL 并生成客户端代码

这是最关键的一步,你需要 WSDL 文件来生成客户端代理类。

方式 A:使用 wsimport 命令行工具 (推荐)

Java如何调用web service?-图2
(图片来源网络,侵删)

wsimport 是 JDK 自带的工具,位于 JDK 的 bin 目录下。

  1. 打开命令行(CMD 或 PowerShell)。

  2. 执行以下命令:

    # -p: 指定生成的包名
    # -d: 指定生成的 .class 文件存放目录
    # -keep: 生成源代码文件
    # -s: 指定生成的 .java 文件存放目录
    wsimport -p com.example.jaxws.client -d target/classes -s src/main/java http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl

    执行成功后,你会在指定的目录下看到一堆生成的 .java.class 文件,其中最重要的一个是 MobileCodeWSSoap(或类似名字),它是你调用的接口。

方式 B:使用 IDE (如 IntelliJ IDEA 或 Eclipse)

现代 IDE 集成了这个功能,操作更简单。

  1. 在 IDEA 中,右键你的项目 -> New -> Web Service Client
  2. 在弹出的窗口中,输入 WSDL URL (http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl)。
  3. 点击 OK,IDE 会自动完成代码的生成。

步骤 2:编写 Java 代码调用服务

你可以直接在代码中使用生成的接口了。

package com.example.jaxws.client;
public class JaxwsClient {
    public static void main(String[] args) {
        // 1. 创建服务视图 (Service)
        // 参数是 WSDL 中的 <service name="..."> 的值
        MobileCodeWS service = new MobileCodeWS();
        // 2. 获取服务端点接口 (PortType)
        // 参数是 WSDL 中的 <port name="..." binding="..."> 的值
        MobileCodeWSSoap port = service.getMobileCodeWSSoap();
        // 3. 调用方法,就像调用本地方法一样
        String result = port.getMobileCodeInfo("13800138000", "");
        // 4. 输出结果
        System.out.println("查询结果: " + result);
    }
}

优点:

  • 标准,JDK 内置,无需额外依赖。
  • 代码简单,屏蔽了底层的 SOAP 通信细节。

缺点:

  • 对于复杂的 WSDL 或 XML 绑定,生成的代码可能很繁琐。
  • 灵活性较差,配置选项有限。

使用 Apache CXF 框架

CXF 是一个功能更全面的框架,它同样支持 JAX-WS 规范,但提供了更多高级特性。

步骤 1:添加 Maven 依赖

在你的 pom.xml 文件中添加 CXF 的依赖。

<dependencies>
    <!-- CXF 核心依赖 -->
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxws</artifactId>
        <version>3.5.5</version> <!-- 使用最新稳定版 -->
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http</artifactId>
        <version>3.5.5</version>
    </dependency>
</dependencies>

步骤 2:编写 Java 代码调用服务

CXF 提供了两种方式调用:动态调用和静态调用,静态调用和 JAX-WS 类似,也需要先生成代码,这里我们展示更灵活的动态客户端

package com.example.cxf.client;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.jaxws.JaxWsDynamicClientFactory;
public class CxfClient {
    public static void main(String[] args) {
        // --- 方式一:使用 JaxWsProxyFactoryBean (类似静态代理) ---
        // 1. 创建工厂
        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
        // 2. 设置服务接口 (需要从 wsimport 生成或手动编写)
        // factory.setServiceClass(MobileCodeWSSoap.class);
        // 3. 设置服务地址
        // factory.setAddress("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx");
        // 4. 创建客户端
        // MobileCodeWSSoap soap = factory.create(MobileCodeWSSoap.class);
        // String result1 = soap.getMobileCodeInfo("13912345678", "");
        // System.out.println("CXF Proxy 方式查询结果: " + result1);
        // --- 方式二:使用 JaxWsDynamicClientFactory (动态调用,无需生成代码) ---
        // 这是 CXF 的一个强大功能,特别适合快速调用或 WSDL 结构复杂的场景
        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
        // wsdlUrl 必须是完整的 WSDL 地址
        Client client = dcf.createClient("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl");
        try {
            // invoke 方法参数: 方法名, 参数1, 参数2, ...
            // 返回值是一个 Object[],包含所有返回值
            Object[] result = client.invoke("getMobileCodeInfo", "18612345678", "");
            System.out.println("CXF Dynamic 方式查询结果: " + result[0]);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

优点:

  • 功能强大,支持 SOAP 和 REST。
  • 动态客户端非常灵活,无需提前生成代码。
  • 拥有丰富的拦截器、数据绑定等功能。

缺点:

  • 需要引入额外的框架依赖。

调用 RESTful Web Service (使用 OkHttp + Jackson)

如果你的 Web Service 是 RESTful 风格的(返回 JSON),那么使用 SOAP 的方式就太重了,这时,使用 HTTP 客户端和 JSON 解析器是最佳选择。

步骤 1:添加 Maven 依赖

<dependencies>
    <!-- OkHttp HTTP 客户端 -->
    <dependency>
        <groupId>com.squareup.okhttp3</groupId>
        <artifactId>okhttp</artifactId>
        <version>4.11.0</version> <!-- 使用最新稳定版 -->
    </dependency>
    <!-- Jackson JSON 解析器 -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.15.2</version> <!-- 使用最新稳定版 -->
    </dependency>
</dependencies>

步骤 2:定义请求和响应的 Java 对象 (POJO)

你需要根据 API 返回的 JSON 结构创建对应的 Java 类。

分享:
扫描分享到社交APP
上一篇
下一篇