- JAX-WS (Java API for XML-Based Web Services):这是 Java 标准的、官方的 WebService 开发规范,它主要用于调用基于 SOAP 协议的 WebService,对于现在绝大多数的公共 WebService(如天气查询、短信发送等),JAX-WS 是最常用、最稳定的选择。
- JAX-RS (Java API for RESTful Web Services):这是用于开发RESTful 风格 WebService 的规范,它通常与 HTTP 协议结合,使用 JSON 或 XML 作为数据交换格式,是目前微服务架构中最流行的 API 设计风格。
下面我将分别详细介绍这两种方式,并提供完整的代码示例。

使用 JAX-WS 调用 SOAP WebService
JAX-WS 在 Java 6 及以上版本中已经内置,无需额外添加依赖,其核心是使用 wsimport 命令生成客户端代码,然后像调用本地方法一样调用远程服务。
步骤 1:获取 WSDL 地址
每个 SOAP WebService 都会提供一个 WSDL (Web Services Description Language) 文件,它描述了服务的所有接口、方法、参数和返回值,你需要找到这个地址,一个公共的天气查询服务的 WSDL 地址可能是:
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
步骤 2:使用 wsimport 生成客户端代码
打开你的命令行(CMD 或 PowerShell),切换到你的项目目录,然后执行以下命令:
wsimport -p com.example.client -keep -s src http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
命令参数说明:

-p com.example.client:指定生成的 Java 包名。-keep:生成源代码文件,方便查看和调试。-s src:指定源代码生成的目录(例如你的src/main/java目录)。WSDL_URL:WSDL 文件的地址。
执行成功后,你的项目目录下会生成一堆 .java 文件(包括 Service、PortType、Sei 等接口和实现类)。
步骤 3:在 Java 代码中调用服务
生成的代码中,你会找到一个 XXXService 类(WeatherWebService),这是你调用的入口。
示例代码:
import com.example.client.WeatherWebService; // 这是 wsimport 生成的 Service 类
import com.example.client.WeatherWebServiceSoap; // 这是生成的服务端点接口
import com.example.client.GetWeatherRequest;
import com.example.client.GetWeatherResponse;
public class JaxWsClient {
public static void main(String[] args) {
// 1. 创建 Service 实例
// WeatherWebService 是 wsimport 生成的类,它代表了整个 WebService
WeatherWebService service = new WeatherWebService();
// 2. 获取 Port (服务端点)
// WeatherWebServiceSoap 是 wsimport 生成的接口,它定义了可以调用的方法
// 参数 "WeatherWebServiceSoap" 是 WSDL 中定义的 port name
WeatherWebServiceSoap port = service.getWeatherWebServiceSoap();
// 3. 准备请求参数
// GetWeatherRequest 是生成的请求对象类
GetWeatherRequest request = new GetWeatherRequest();
request.setTheCityCode("北京"); // 设置要查询的城市
// 4. 调用远程方法
// GetWeatherResponse 是生成的响应对象类
GetWeatherResponse response = port.getWeather(request);
// 5. 处理响应结果
if (response != null && response.getGetWeatherResult() != null) {
// getGetWeatherResult() 方法返回的是 XML 格式的字符串
String weatherInfo = response.getGetWeatherResult();
System.out.println("获取到的天气信息:");
System.out.println(weatherInfo);
} else {
System.out.println("获取天气信息失败。");
}
}
}
使用 JAX-RS (RESTful Client) 调用 REST API
JAX-RS 本身是服务端规范,但客户端调用通常遵循其思想,或者使用其官方参考实现 Jersey、Apache CXF 等框架,这里我们以最流行的 Spring RestTemplate (Spring Framework) 和现代的 Java 11+ HttpClient 为例。

场景:调用一个公开的 REST API,http://api.example.com/users/1,返回 JSON 数据。
方法 A:使用 Spring RestTemplate (传统方式)
RestTemplate 是 Spring 框架中的一个强大工具,用于同步发起 HTTP 请求。
添加 Spring Boot 依赖
如果你使用 Maven,在 pom.xml 中添加:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
编写代码
import org.springframework.web.client.RestTemplate;
import org.springframework.http.ResponseEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpEntity;
import org.springframework.http.MediaType;
// 假设有一个用户类来映射 JSON 响应
class User {
private int id;
private String name;
private String email;
// Getters and Setters...
@Override
public String toString() {
return "User{" + "id=" + id + ", name='" + name + '\'' + ", email='" + email + '\'' + '}';
}
}
public class RestTemplateClient {
public static void main(String[] args) {
// 1. 创建 RestTemplate 实例
RestTemplate restTemplate = new RestTemplate();
// 2. 定义 API 的 URL
String url = "http://jsonplaceholder.typicode.com/users/1"; // 一个公共的测试 API
// 3. 发送 GET 请求,并直接将响应体映射为 User 对象
// RestTemplate 会自动将 JSON 转换为 User 对象(需要 Jackson 或 Gson 支持,Web Starter 已包含)
User user = restTemplate.getForObject(url, User.class);
// 4. 打印结果
System.out.println("通过 RestTemplate 获取到的用户信息:");
System.out.println(user);
}
}
方法 B:使用 Java 11+ HttpClient (现代标准方式)
从 Java 11 开始,java.net.http.HttpClient 成为 Java 标准库的一部分,功能强大且是异步和非阻塞的。
无需额外依赖,直接使用 JDK
编写代码
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
// 同样使用上面的 User 类
public class HttpClientClient {
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
// 同样使用 jsonplaceholder 的测试 API
HttpRequest request = HttpRequest.newBuilder()
.GET()
.uri(URI.create("http://jsonplaceholder.typicode.com/users/1"))
.header("Accept", "application/json") // 告诉服务器我们期望接收 JSON
.build();
// 3. 发送请求并获取响应
// .bodyHandler 是一个响应处理器,这里我们直接获取响应体字符串
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
// 4. 检查响应状态码并处理响应体
if (response.statusCode() == 200) {
System.out.println("通过 HttpClient 获取到的用户信息:");
System.out.println(response.body()); // response.body() 是 JSON 字符串
// 如果需要解析成对象,你需要引入 Jackson 或 Gson 等库
// ObjectMapper mapper = new ObjectMapper();
// User user = mapper.readValue(response.body(), User.class);
// System.out.println(user);
} else {
System.out.println("请求失败,状态码: " + response.statusCode());
}
}
}
总结与对比
| 特性 | JAX-WS (SOAP) | JAX-RS (RESTful) / Spring RestTemplate / HttpClient |
|---|---|---|
| 协议 | SOAP (基于 XML,有严格规范) | HTTP (GET, POST, PUT, DELETE 等) |
| 数据格式 | XML (标准格式) | JSON (主流), XML, Text 等 |
| 标准性 | Java 官方标准,跨语言性强 | Java API 标准,但客户端实现多样 |
| 性能 | 通常较慢,因为 XML 解析开销大,消息头冗长 | 通常较快,JSON 解析效率高,HTTP 轻量 |
| 使用场景 | 企业级应用、金融、电信等对事务和安全要求高的场景 | 现代 Web 应用、移动端后端、微服务 |
| Java 内置 | 是 (wsimport 命令) |
否 (HttpClient 是 Java 11+ 内置,RestTemplate 需 Spring) |
| 学习曲线 | 较陡峭,需要理解 WSDL、SOAP 等概念 | 相对平缓,理解 HTTP 即可 |
如何选择?
- 如果你要连接的是一个传统的、公开的 SOAP WebService(很多老系统或政府、金融机构提供),那么毫不犹豫地选择 JAX-WS。
- 如果你正在开发新的应用,或者连接的是一个现代的 RESTful API,那么优先选择 Spring RestTemplate (如果是 Spring 项目) 或 Java 11+ HttpClient,它们更轻量、更符合现代开发的潮流。
