- 传统方式 (JAX-WS):这是目前最主流、最标准的方式,用于创建和调用基于 SOAP 协议的 WebService,它非常成熟,Java SE 6+ 已经内置了支持。
- 现代方式 (JAX-RS / RESTful):现在更流行的是基于 REST 架构风格的 WebService(本质上是 HTTP API),它使用标准的 HTTP 方法(GET, POST, PUT, DELETE),数据格式通常是 JSON 或 XML,JAX-RS 是 Java 中实现 RESTful 服务的标准 API。
- 手动方式 (HTTP Client):对于一些非标准的 WebService,或者当你想获得最大灵活性时,可以直接使用 Java 的 HTTP 客户端(如
HttpURLConnection或第三方库如Apache HttpClient、OkHttp)来手动发送 HTTP 请求并解析响应。
下面我将详细介绍这三种方法,并提供代码示例。

使用 JAX-WS (调用 SOAP WebService)
这是最经典和标准的方法,JAX-WS 会帮你处理底层的 SOAP 协议细节,你只需要像调用本地 Java 方法一样调用远程服务即可。
核心步骤:
-
获取客户端代理类:
- 方式一 (推荐):使用
wsimport命令行工具,根据 WSDL 文件生成客户端所需的 Java 代码(包括Service类和Port接口)。 - 方式二:如果你的项目环境支持(如 JBoss, WebSphere),可以动态创建客户端,无需生成代码。
- 方式一 (推荐):使用
-
创建服务实例:通过生成的
Service类创建一个服务实例。 -
获取服务端点:从服务实例中获取
Port对象,它就是你定义好的服务接口。
(图片来源网络,侵删) -
调用方法:直接在
Port对象上调用方法,就像调用本地方法一样。
示例:
假设我们有一个天气预报的 WebService,其 WSDL 地址为 http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl。
第1步:使用 wsimport 生成客户端代码
打开你的命令行工具(CMD 或 PowerShell),执行以下命令:

# -keep: 生成源代码 # -d: 指定编译后的 .class 文件存放目录 # -p: 指定生成的包名 wsimport -keep -d . -p com.example.weather http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
执行后,会在指定目录下生成一堆 .java 和 .class 文件,其中最重要的是 WeatherWebService (Service类) 和 WeatherWebServiceSoap (Port接口)。
第2步:编写 Java 代码调用
import com.example.weather.WeatherWebService;
import com.example.weather.WeatherWebServiceSoap;
public class JaxWsClient {
public static void main(String[] args) {
try {
// 1. 创建服务实例 (Service class)
WeatherWebService service = new WeatherWebService();
// 2. 获取服务端点 (Port interface)
// getWeatherWebServiceSoap() 是从 WSDL 中生成的获取 Port 的方法名
WeatherWebServiceSoap port = service.getWeatherWebServiceSoap();
// 3. 调用远程方法
// getWeather() 是 Port 接口中定义的方法
String result = port.getWeather("北京", "");
// 4. 处理返回结果
System.out.println("WebService 返回结果:");
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
优点:
- 标准化:是 Java 官方标准,跨平台。
- 简单易用:调用方式与本地方法无异,屏蔽了底层复杂性。
- 工具支持:
wsimport工具非常成熟,能处理各种复杂的 WSDL。
缺点:
- 仅支持 SOAP:只能用于调用 SOAP 协议的 WebService。
- 依赖生成代码:需要先根据 WSDL 生成客户端代码,增加了一步操作。
使用 JAX-RS (调用 RESTful WebService)
RESTful WebService 更像是一个普通的网站 API,使用 HTTP 请求进行交互,在 Java 中,通常使用 Jersey (参考实现) 或 RESTEasy 等框架来调用。
核心步骤:
- 添加依赖:在你的项目中添加 JAX-RS 客户端库的依赖,Jersey。
- 创建客户端:使用
ClientBuilder创建一个Client实例。 - 构建目标 URI:定义你要调用的服务地址。
- 创建 WebTarget:通过
Client和 URI 创建WebTarget对象。 - 发起请求并获取响应:使用
WebTarget的get(),post(),put()等方法发起请求,并指定返回类型(如String,json对象等)。
示例:
假设我们有一个获取用户信息的 RESTful API,GET http://api.example.com/users/123,返回 JSON 数据:{"id": 123, "name": "张三", "email": "zhangsan@example.com"}。
第1步:添加 Maven 依赖
<!-- pom.xml -->
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.37</version> <!-- 使用较新版本 -->
</dependency>
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>2.37</version>
</dependency>
第2步:编写 Java 代码调用
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Response;
public class JaxRsClient {
public static void main(String[] args) {
// 1. 创建 Client 实例
Client client = ClientBuilder.newClient();
try {
// 2. 定义目标 URI
String uri = "http://api.example.com/users/123";
// 3. 创建 WebTarget
WebTarget target = client.target(uri);
// 4. 发起 GET 请求,并期望返回一个 String
// .request() 设置请求头,Accept: application/json
// .get(String.class) 直接将响应体映射为 String
Response response = target.request().get();
if (response.getStatus() == 200) { // 200 OK
String jsonString = response.readEntity(String.class);
System.out.println("API 返回的 JSON 数据:");
System.out.println(jsonString);
// 如果你有一个 User 类,Jackson/Gson 在 classpath 中,
// Jersey 可以自动将 JSON 反序列化为对象
// User user = target.request().get(User.class);
// System.out.println("用户名: " + user.getName());
} else {
System.err.println("请求失败,HTTP 状态码: " + response.getStatus());
}
} finally {
// 5. 关闭 Client
client.close();
}
}
}
优点:
- 轻量级:基于 HTTP,开销小,性能好。
- 简单直观:使用标准的 HTTP 方法,易于理解和调试。
- 灵活性高:可以处理各种格式的数据(JSON, XML, Text 等)。
缺点:
- 无状态:RESTful 服务本身是无状态的,需要自己处理会话管理。
- 非标准化:虽然遵循 REST 原则,但 API 设计风格各异,需要查阅具体文档。
手动使用 HTTP Client
这种方法最底层,也最灵活,当你使用的库无法满足需求,或者需要精细控制 HTTP 请求的每一个细节时(如设置复杂的 Header、处理 Cookie、上传文件等),可以使用它。
核心步骤:
- 添加依赖:使用 Java 内置的
HttpURLConnection或第三方库如Apache HttpClient或OkHttp,这里以HttpURLConnection为例,它无需额外依赖。 - 创建 URL 对象:指向你的服务地址。
- 打开连接:调用
openConnection()方法。 - 设置请求属性:设置请求方法(GET/POST)、请求头(Content-Type, Authorization 等)。
- 发送请求:对于 POST/PUT 请求,需要获取输出流写入数据。
- 获取响应:获取输入流,读取服务器的响应数据。
- 解析响应:手动解析返回的字符串(如 XML 或 JSON)。
示例:
调用一个简单的 POST 请求,发送 JSON 数据并接收响应。
import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java
