调用 SOAP WebService (传统且最常见)
SOAP (Simple Object Access Protocol) 是一种基于 XML 的协议,通常通过 WSDL (Web Services Description Language) 文件来描述其接口,Java 中调用 SOAP WebService 主要有以下几种方式:

- JAX-WS (Java API for XML Web Services):这是 Java 标准的、官方的 SOAP API,在 Java 6 及以上版本中,JAX-WS 已经被内置。
- Apache Axis2 / CXF:这些都是成熟的第三方框架,功能强大,但通常比标准的 JAX-WS 更复杂。
对于绝大多数情况,使用 JAX-WS 是最简单、最推荐的方式。
方法 1:使用 JAX-WS (最推荐)
这种方法的核心是 wsimport 命令行工具,它会根据 WSDL 文件自动生成客户端所需的 Java 代码(如接口、服务类等),你只需要像调用本地方法一样调用即可。
步骤:
-
获取 WSDL 文件 找到你要调用的 WebService 的 WSDL 地址,
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
(图片来源网络,侵删) -
生成客户端代码 打开命令行(CMD 或 PowerShell),使用
wsimport工具生成代码,你需要指定 WSDL 的地址和代码生成的目标目录。# -p: 指定生成的包名 # -d: 指定生成的 .class 文件存放目录 # -keep: 生成 .java 源文件,方便查看 # -s: 指定生成的 .java 源文件存放目录 (如果不用 -keep, -s 也可以) wsimport -p com.example.weather.client -d ./src/main/java -keep http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
执行后,会在
com.example.weather.client包下生成一系列.java文件,包括:WeatherWebService.java:服务接口WeatherWebServiceService.java:服务工厂类- 以及一些用于数据传递的类(如
getWeatherbyCityName等)。
-
编写 Java 代码调用 在你的 Java 项目中,引入生成的类,然后进行调用。
package com.example.weather.client; public class WeatherClient { public static void main(String[] args) { // 1. 创建服务工厂类的实例 WeatherWebServiceService service = new WeatherWebServiceService(); // 2. 从工厂类中获取服务接口的实例 WeatherWebService weatherWebService = service.getWeatherWebServicePort(); // 3. 直接调用接口中的方法,就像调用本地方法一样 // 注意:这里的方法名和参数需要根据生成的接口来定 // 假设 WSDL 提供了一个 getWeather 方法 // String[] result = weatherWebService.getWeather("北京", null); // 以 webxml.com 的天气查询为例 String[] weatherInfo = weatherWebService.getWeatherbyCityName("上海"); if (weatherInfo != null) { System.out.println("查询到的天气信息:"); for (String info : weatherInfo) { System.out.println(info); } } else { System.out.println("查询失败,未获取到天气信息。"); } } }
优点:

- 标准化,是 Java 官方推荐的方式。
- 开发简单,
wsimport自动生成大部分代码。 - 与 Java 集成度高。
缺点:
- 生成的代码可能比较冗长。
- 依赖 Java 环境,生成的代码是强类型的。
方法 2:使用 Apache Axis2 (功能强大,配置稍复杂)
Axis2 是一个非常流行的 SOAP 框架,支持更高级的特性,但它比 JAX-WS 需要更多的配置。
步骤:
-
添加依赖 在你的
pom.xml(Maven) 中添加 Axis2 的依赖。<dependency> <groupId>org.apache.axis2</groupId> <artifactId>axis2</artifactId> <version>1.7.9</version> <!-- 使用较新稳定的版本 --> </dependency> <dependency> <groupId>org.apache.axis2</groupId> <artifactId>axis2-transport-http</artifactId> <version>1.7.9</version> </dependency> -
编写调用代码 Axis2 可以通过代码动态地调用 WSDL,无需预先生成客户端代码。
import org.apache.axis2.client.ServiceClient; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; public class Axis2WeatherClient { public static void main(String[] args) throws Exception { // 1. 定义 WSDL 的 URL String wsdlUrl = "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl"; // 2. 定义要调用的方法名和命名空间 // 命名空间通常可以在 WSDL 文件的 <service> 或 <portType> 标签中找到 String action = "http://WebXml.com.cn/getWeatherbyCityName"; String methodName = "getWeatherbyCityName"; // 3. 创建 ServiceClient ServiceClient serviceClient = new ServiceClient(); // 4. 设置目标服务的 EPR (Endpoint Reference) EndpointReference targetEPR = new EndpointReference(wsdlUrl.replace("?wsdl", "")); serviceClient.setOptions(new Options()); serviceClient.getOptions().setTo(targetEPR); // 5. 设置 SOAP Action,这通常很重要 serviceClient.getOptions().setAction(action); // 6. 准备参数 // 参数是一个 Object 数组,顺序必须与 WSDL 中定义的顺序一致 Object[] params = new Object[]{"上海"}; // 7. 调用方法 // 返回结果通常是 OMElement (AXIS Object Model) 对象 org.apache.axiom.om.OMElement result = serviceClient.sendReceive(methodName, params); // 8. 处理结果 System.out.println("AXIS2 查询结果 (XML 格式):"); result.serialize(System.out); // 直接打印 XML // 如果需要将 OMElement 转换为 String 数组,需要额外的解析逻辑 // String resultText = result.getText(); // String[] weatherInfo = resultText.split(","); // ... } }
优点:
- 动态调用,无需生成客户端代码。
- 功能强大,支持 WS-* 等标准。
- 灵活性高。
缺点:
- 配置相对复杂。
- 需要引入额外的第三方库。
调用 RESTful WebService (现代主流)
RESTful WebService 通常基于 HTTP 协议,使用 JSON 或 XML 作为数据格式,调用方式更简单、轻量级,在 Java 中调用 RESTful 服务,最常用的是 HttpClient 和 OkHttp 等库。
方法 1:使用 Java 11+ 的 HttpClient (推荐,现代且原生)
如果你使用的是 Java 11 或更高版本,可以直接使用内置的 HttpClient,无需额外依赖。
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpResponse.BodyHandlers;
import java.time.Duration;
public class Java11HttpClientExample {
public static void main(String[] args) throws Exception {
// 1. 创建 HttpClient 实例
HttpClient client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_2)
.connectTimeout(Duration.ofSeconds(10))
.build();
// 2. 创建 HttpRequest 请求
// 假设这是一个获取 JSON 数据的 REST API
String apiUrl = "https://jsonplaceholder.typicode.com/posts/1";
HttpRequest request = HttpRequest.newBuilder()
.GET()
.uri(URI.create(apiUrl))
.header("Accept", "application/json") // 设置请求头,表示接受 JSON 响应
.build();
// 3. 发送请求并获取响应
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
// 4. 处理响应
System.out.println("状态码: " + response.statusCode());
System.out.println("响应体 (JSON):");
System.out.println(response.body());
}
}
POST 请求示例:
// ... (HttpClient 创建同上)
// POST 请求
String postUrl = "https://jsonplaceholder.typicode.com/posts";
String jsonBody = "{\"title\":\"foo\",\"body\":\"bar\",\"userId\": 