杰瑞科技汇

Java如何调用WebService接口?

核心概念

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

Java如何调用WebService接口?-图1
(图片来源网络,侵删)
  1. SOAP (Simple Object Access Protocol)

    • 一种基于 XML 的协议,用于交换结构化的信息。
    • 它有严格的规范,包括信封、头部、体等部分。
    • 通常通过 HTTP/HTTPS 协议传输,但也可以通过 SMTP 等协议。
    • WSDL (Web Services Description Language) 是 SOAP WebService 的“说明书”,描述了接口地址、可用方法、参数类型、返回值类型等所有信息。
  2. 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 文件自动生成客户端代码,极大简化了调用过程。

Java如何调用WebService接口?-图2
(图片来源网络,侵删)

步骤 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 文件。

Java如何调用WebService接口?-图3
(图片来源网络,侵删)

步骤 3:编写 Java 代码调用服务

你可以在你的 Java 项目中(例如一个 Maven 或 Gradle 项目)使用这些生成的类来调用服务。

  1. 将生成的 .class 文件(或者直接将生成的 com 目录)复制到你的项目中,并确保它在类路径下。
  2. 创建一个测试类进行调用。

示例代码:

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

  1. 在项目中创建一个新的客户端。
  2. 选择 "Web Services Client"。
  3. 输入 WSDL 的 URL,IDE 会自动下载并解析,生成所有必要的客户端代码。
  4. 直接调用生成的类即可。

调用 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

分享:
扫描分享到社交APP
上一篇
下一篇