杰瑞科技汇

Java连接Webservice如何实现?

  1. JAX-WS (Java API for XML-Based Web Services):这是 Java 标准的、官方的 WebService 开发规范,它主要用于调用基于 SOAP 协议的 WebService,对于现在绝大多数的公共 WebService(如天气查询、短信发送等),JAX-WS 是最常用、最稳定的选择。
  2. JAX-RS (Java API for RESTful Web Services):这是用于开发RESTful 风格 WebService 的规范,它通常与 HTTP 协议结合,使用 JSON 或 XML 作为数据交换格式,是目前微服务架构中最流行的 API 设计风格。

下面我将分别详细介绍这两种方式,并提供完整的代码示例。

Java连接Webservice如何实现?-图1
(图片来源网络,侵删)

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

命令参数说明:

Java连接Webservice如何实现?-图2
(图片来源网络,侵删)
  • -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 本身是服务端规范,但客户端调用通常遵循其思想,或者使用其官方参考实现 JerseyApache CXF 等框架,这里我们以最流行的 Spring RestTemplate (Spring Framework) 和现代的 Java 11+ HttpClient 为例。

Java连接Webservice如何实现?-图3
(图片来源网络,侵删)

场景:调用一个公开的 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,它们更轻量、更符合现代开发的潮流。
分享:
扫描分享到社交APP
上一篇
下一篇