杰瑞科技汇

Java调用WebService的常用方法有哪些?

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

下面我将详细介绍这三种方法,并提供代码示例。

Java调用WebService的常用方法有哪些?-图1
(图片来源网络,侵删)

使用 JAX-WS (调用 SOAP WebService)

这是最经典和标准的方法,JAX-WS 会帮你处理底层的 SOAP 协议细节,你只需要像调用本地 Java 方法一样调用远程服务即可。

核心步骤:

  1. 获取客户端代理类

    • 方式一 (推荐):使用 wsimport 命令行工具,根据 WSDL 文件生成客户端所需的 Java 代码(包括 Service 类和 Port 接口)。
    • 方式二:如果你的项目环境支持(如 JBoss, WebSphere),可以动态创建客户端,无需生成代码。
  2. 创建服务实例:通过生成的 Service 类创建一个服务实例。

  3. 获取服务端点:从服务实例中获取 Port 对象,它就是你定义好的服务接口。

    Java调用WebService的常用方法有哪些?-图2
    (图片来源网络,侵删)
  4. 调用方法:直接在 Port 对象上调用方法,就像调用本地方法一样。

示例:

假设我们有一个天气预报的 WebService,其 WSDL 地址为 http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl

第1步:使用 wsimport 生成客户端代码

打开你的命令行工具(CMD 或 PowerShell),执行以下命令:

Java调用WebService的常用方法有哪些?-图3
(图片来源网络,侵删)
# -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 等框架来调用。

核心步骤:

  1. 添加依赖:在你的项目中添加 JAX-RS 客户端库的依赖,Jersey。
  2. 创建客户端:使用 ClientBuilder 创建一个 Client 实例。
  3. 构建目标 URI:定义你要调用的服务地址。
  4. 创建 WebTarget:通过 Client 和 URI 创建 WebTarget 对象。
  5. 发起请求并获取响应:使用 WebTargetget(), 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、上传文件等),可以使用它。

核心步骤:

  1. 添加依赖:使用 Java 内置的 HttpURLConnection 或第三方库如 Apache HttpClientOkHttp,这里以 HttpURLConnection 为例,它无需额外依赖。
  2. 创建 URL 对象:指向你的服务地址。
  3. 打开连接:调用 openConnection() 方法。
  4. 设置请求属性:设置请求方法(GET/POST)、请求头(Content-Type, Authorization 等)。
  5. 发送请求:对于 POST/PUT 请求,需要获取输出流写入数据。
  6. 获取响应:获取输入流,读取服务器的响应数据。
  7. 解析响应:手动解析返回的字符串(如 XML 或 JSON)。

示例:

调用一个简单的 POST 请求,发送 JSON 数据并接收响应。

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java
分享:
扫描分享到社交APP
上一篇
下一篇