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

- JAX-WS (Java API for XML Web Services):这是 Java 官方标准的、最主流的方式,用于创建和调用基于 SOAP 协议的 Web Service,从 Java 6 开始,JAX-WS 就已经内置在 JDK 中了。
- Apache CXF:这是一个功能强大的、开源的 Web Service 框架,它既支持 SOAP,也支持 RESTful Web Service,它提供了更灵活的配置和更丰富的功能,是 JAX-WS 的一个优秀实现。
- 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 命令行工具 (推荐)

wsimport 是 JDK 自带的工具,位于 JDK 的 bin 目录下。
-
打开命令行(CMD 或 PowerShell)。
-
执行以下命令:
# -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 集成了这个功能,操作更简单。
- 在 IDEA 中,右键你的项目 ->
New->Web Service Client。 - 在弹出的窗口中,输入 WSDL URL (
http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl)。 - 点击
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 类。
