核心概念
在开始之前,我们先简单了解两个主流的 WebService 标准:

-
SOAP (Simple Object Access Protocol):
- 一种基于 XML 的协议,用于交换结构化的信息。
- 它有严格的规范,包括信封、头部、体等部分。
- 通常通过 HTTP/HTTPS 协议传输,但也可以通过 SMTP 等协议。
- WSDL (Web Services Description Language) 是 SOAP WebService 的“说明书”,描述了接口地址、可用方法、参数类型、返回值类型等所有信息。
-
RESTful WebService:
- 一种基于 HTTP 协议的架构风格,而不是一个严格的协议。
- 它使用标准的 HTTP 方法(GET, POST, PUT, DELETE)来执行 CRUD(创建、读取、更新、删除)操作。
- 数据格式通常为 JSON 或 XML,现代应用中 JSON 更为常见。
- 它通常没有 WSDL,API 的行为通过 URL 和 HTTP 方法来定义。
调用 WebService 的方法也主要分为两大类:调用 SOAP 服务和调用 RESTful 服务。
调用 SOAP WebService (最常用)
对于 SOAP 服务,最佳实践是使用 JDK 自带的 JAX-WS 规范,它会根据服务的 WSDL 文件自动生成客户端代码,极大简化了调用过程。

步骤 1:获取 WSDL 文件
WSDL 文件是服务的“说明书”,你可以在服务的 URL 后面加上 ?wsdl 参数来获取。
http://www.webxml.com.cn/webservices/weatherwebservice.asmx?wsdl
步骤 2:生成客户端代码
你需要使用 JDK 自带的 wsimport 工具来根据 WSDL 文件生成 Java 客户端代码。
打开你的命令行(CMD 或 PowerShell),执行以下命令:
# -p: 指定生成的包名 # -d: 指定代码存放的目录 # -keep: 生成代码后保留 .java 文件,方便查看 wsimport -p com.example.client -d . -keep http://www.webxml.com.cn/webservices/weatherwebservice.asmx?wsdl
执行后,你会在指定的目录(-d . 表示当前目录)下看到一个 com/example/client 包,里面包含了一系列 .java 文件(如 WeatherWS.java, WeatherWSLocator.java, GetWeatherCityCode.java 等)和 .class 文件。

步骤 3:编写 Java 代码调用服务
你可以在你的 Java 项目中(例如一个 Maven 或 Gradle 项目)使用这些生成的类来调用服务。
- 将生成的
.class文件(或者直接将生成的com目录)复制到你的项目中,并确保它在类路径下。 - 创建一个测试类进行调用。
示例代码:
import com.example.client.WeatherWS;
import com.example.client.WeatherWSLocator;
import com.example.client.GetWeather;
import com.example.client.GetWeatherResponse;
import com.example.client.ArrayOfString;
public class WeatherServiceClient {
public static void main(String[] args) {
try {
// 1. 创建服务定位器,根据生成的 WeatherWSLocator 类
WeatherWSLocator locator = new WeatherWSLocator();
// 2. 获取服务的端口 (实现类)
// 可以直接使用 getWeatherWS(),或者通过 URL 创建
// WeatherWS port = locator.getWeatherWS();
WeatherWS port = locator.getWeatherWS(new java.net.URL("http://www.webxml.com.cn/webservices/weatherwebservice.asmx"));
// 3. 创建请求对象,设置参数
// GetWeather 是请求的封装类
GetWeather request = new GetWeather();
request.setTheCityCode("北京"); // 设置要查询的城市
// 4. 调用方法,获取响应
// GetWeatherResponse 是响应的封装类
GetWeatherResponse response = port.getWeather(request);
// 5. 处理响应结果
ArrayOfString weatherInfo = response.getGetWeatherResult();
if (weatherInfo != null && weatherInfo.getString() != null) {
System.out.println("获取到的天气信息:");
for (String info : weatherInfo.getString()) {
System.out.println(info);
}
} else {
System.out.println("未能获取到天气信息。");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
IDE 集成开发 (更简单)
如果你使用的是 IntelliJ IDEA 或 Eclipse,这个过程会更加简单,无需手动执行 wsimport。
- 在项目中创建一个新的客户端。
- 选择 "Web Services Client"。
- 输入 WSDL 的 URL,IDE 会自动下载并解析,生成所有必要的客户端代码。
- 直接调用生成的类即可。
调用 RESTful WebService
现代 Web 服务大多采用 RESTful 风格,通常以 JSON 格式交换数据,在 Java 中调用 RESTful API 最主流的工具是 OkHttp + Gson/Jackson,或者使用更高级的 Spring RestTemplate(已进入维护模式)和 Spring WebClient(推荐用于响应式编程)。
这里我们以最流行的 OkHttp + Gson 组合为例。
步骤 1:添加依赖
如果你使用 Maven,在 pom.xml 中添加以下依赖:
<!-- OkHttp: 用于发送 HTTP 请求 -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.12.0</version> <!-- 使用最新版本 -->
</dependency>
<!-- Gson: 用于解析 JSON -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version> <!-- 使用最新版本 -->
</dependency>
步骤 2:创建 Java 实体类
你需要根据 API 返回的 JSON 结构,创建对应的 Java 实体类(POJO),以便 Gson 解析。
假设有一个获取用户信息的 API:https://jsonplaceholder.typicode.com/users/1,返回的 JSON 如下:
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "Sincere@april.biz",
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.1496"
}
}
}
你需要创建对应的 Java 类:
// Address.java
public class Address {
public String street;
public String suite;
public String city;
public String zipcode;
public Geo geo;
}
// Geo.java
public class Geo {
public String lat;
public String lng;
}
// User.java
public class User {
public int id;
public String name;
public String username;
public String email;
public Address address;
}
步骤 3:编写调用代码
import com.google.gson.Gson;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class RestClientExample {
private static final OkHttpClient client = new OkHttpClient();
private static final Gson gson = new Gson();
public static void main(String[] args) {
String apiUrl = "https://jsonplaceholder.typicode.com/users/1";
try {
// 1. 创建一个请求
Request request = new Request.Builder()
.url(apiUrl)
.build();
// 2. 发送请求并获取响应
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) {
throw new RuntimeException("Unexpected code " + response);
}
// 3. 获取响应体 (JSON 字符串)
String responseBody = response.body().string();
System.out.println("原始 JSON 响应:");
System.out.println(responseBody);
// 4. 使用 Gson 将 JSON 字符串解析为 Java 对象
User user = gson.fromJson(responseBody, User.class);
// 5. 处理数据
System.out.println("\n解析后的 User 对象:");
System.out.println("ID: " + user.id);
System.out.println("Name: " + user.name);
System.out.println("Email: " + user.email);
System.out.println("City: " + user.address.city);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用 Apache CXF (功能强大的框架)
Apache CX
