杰瑞科技汇

Java如何调用Webservice接口?

  1. 传统方式 (JAX-WS):这是Java官方的标准,适用于基于SOAP(简单对象访问协议)的WebService,它生成客户端代码,调用起来就像调用本地Java方法一样。
  2. 现代/RESTful方式 (JAX-RS / HttpClient):现在很多WebService以RESTful API的形式提供,它们通常返回JSON或XML数据,这种情况下,我们通常不使用专门的WebService客户端库,而是使用通用的HTTP客户端(如HttpClientOkHttpRestTemplate)来发送请求。

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

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

使用 JAX-WS (调用 SOAP WebService)

JAX-WS 是调用传统SOAP WebService的标准方式,最关键的一步是使用wsimport工具根据WSDL(Web Services Description Language)文件生成客户端代码。

步骤详解

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

第一步:生成客户端代码

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

Java如何调用Webservice接口?-图2
(图片来源网络,侵删)
# -p: 指定生成的客户端代码的包名
# -d: 指定代码生成的目录 (会创建一个目录)
# -keep: 生成后保留源文件
wsimport -p com.example.weather.client -d ./src/main/java -keep http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl

执行成功后,你会在指定的com.example.weather.client包下看到一堆生成的Java文件(如WeatherWebService.java, WeatherWebServiceSoap.java, GetWeatherCityCode.java等),这些文件就是客户端的代理类。

第二步:将生成的代码导入项目

如果你使用Maven或Gradle,可以将生成的代码打包成一个JAR文件,然后作为依赖引入,或者,更简单的方式是直接将生成的.java文件复制到你的项目中。

第三步:编写Java代码调用WebService

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

生成的代码中,通常会包含一个XXXService(如WeatherWebService)类和一个XXX(如WeatherWebServiceSoap)接口,通过XXXService获取XXX接口的实例,然后调用其方法。

package com.example.weather.client;
public class WeatherClient {
    public static void main(String[] args) {
        try {
            // 1. 创建服务实例 (WeatherWebService 是生成的类)
            WeatherWebService service = new WeatherWebService();
            // 2. 获取服务端口 (WeatherWebServiceSoap 是生成的接口)
            WeatherWebServiceSoap soap = service.getWeatherWebServiceSoap();
            // 3. 调用WebService方法
            // 假设我们需要获取北京的天气,城市代码是"北京"
            String cityCode = "北京";
            // GetWeather是WSDL中定义的一个操作
            ArrayOfString weatherInfo = soap.getWeatherbyCityName(cityCode);
            // 4. 处理返回结果
            if (weatherInfo != null && weatherInfo.getString() != null) {
                System.out.println("获取 " + cityCode + " 的天气信息成功:");
                for (String info : weatherInfo.getString()) {
                    System.out.println(info);
                }
            } else {
                System.out.println("获取天气信息失败,请检查城市名称或网络连接。");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

JAX-WS核心注解说明 (了解即可,因为是生成的代码):

  • @WebService: 用于标注一个类或接口作为WebService服务端或客户端的入口。
  • @WebMethod: 用于标注类中的方法作为对外暴露的WebService方法。
  • @WebParam: 用于标注方法的参数,可以指定参数名和类型。

调用 RESTful WebService (返回JSON/XML)

绝大多数新开发的WebService都是RESTful风格的,它们使用HTTP协议(GET, POST, PUT, DELETE等),通常返回JSON格式的数据,调用它就像访问一个普通的网页API。

这里我们推荐使用Spring Framework中的RestTemplate(传统但经典)或WebClient(现代、响应式),下面以RestTemplate为例。

步骤详解

假设我们要调用一个获取用户信息的RESTful API:

  • URL: https://jsonplaceholder.typicode.com/users/1
  • 方法: GET
  • 返回: JSON格式的用户信息

第一步:添加依赖

确保你的项目中RestTemplate的依赖,如果你使用Spring Boot,通常spring-boot-starter-web已经包含了它。

<!-- pom.xml (Maven) -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

第二步:创建一个用于接收JSON数据的POJO (Plain Old Java Object)

根据API返回的JSON结构,创建一个对应的Java类,这样RestTemplate可以自动将JSON解析成对象。

// User.java
public class User {
    private int id;
    private String name;
    private String username;
    private String email;
    // ... 其他字段
    // 必须有无参构造函数
    public User() {}
    // Getters and Setters
    public int getId() { return id; }
    public void setId(int id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    // ... 其他getter和setter
}

第三步:编写Java代码进行HTTP调用

import org.springframework.web.client.RestTemplate;
public class RestfulClient {
    public static void main(String[] args) {
        // 1. 创建 RestTemplate 实例
        RestTemplate restTemplate = new RestTemplate();
        // 2. 定义API的URL
        String url = "https://jsonplaceholder.typicode.com/users/1";
        // 3. 发送GET请求,并直接将返回的JSON映射为User对象
        // getForObject是RestTemplate提供的一个便捷方法
        User user = restTemplate.getForObject(url, User.class);
        // 4. 处理返回结果
        if (user != null) {
            System.out.println("成功获取用户信息:");
            System.out.println("ID: " + user.getId());
            System.out.println("Name: " + user.getName());
            System.out.println("Email: " + user.getEmail());
        } else {
            System.out.println("获取用户信息失败。");
        }
    }
}

如果需要发送POST请求呢?

// 假设我们要创建一个新用户
String postUrl = "https://jsonplaceholder.typicode.com/users";
User newUser = new User();
newUser.setName("John Doe");
newUser.setUsername("johndoe");
newUser.setEmail("john.doe@example.com");
// 发送POST请求,并返回新创建的用户对象(包含服务器生成的ID)
User createdUser = restTemplate.postForObject(postUrl, newUser, User.class);
System.out.println("创建新用户成功,ID为: " + createdUser.getId());

总结与对比

特性 JAX-WS (SOAP) RESTful (JAX-RS / HttpClient)
协议 SOAP (基于XML,有严格规范) HTTP (GET, POST, PUT, DELETE等)
数据格式 XML (标准格式) JSON, XML, HTML, Text (常用JSON)
接口描述 WSDL API文档 (如Swagger/OpenAPI)
调用方式 通过生成的代理类,像调用本地方法 构建HTTP请求,处理HTTP响应
优点 - 标准化、语言无关
- 内置安全、事务支持
- 自动处理类型转换
- 轻量、简单、灵活
- 无需额外工具,易于调试(直接在浏览器访问)
- 更适合移动端和前后端分离
缺点 - 复杂、冗余(SOAP信头)
- 性能相对较低
- 学习和使用门槛稍高
- 无统一标准,依赖文档
- 安全、事务等需要自己实现
- 需要手动处理序列化/反序列化
适用场景 企业级应用、金融、电信等对事务和安全要求高的传统系统 现代Web应用、移动应用API、微服务架构

如何选择?

  • 如果你要调用的服务是一个传统的、基于SOAP的WebService(很多政府、银行、老牌公司的系统还在用),那么必须使用JAX-WS
  • 如果你要调用的服务是现代的、基于RESTful API(绝大多数新系统都是这样),那么强烈推荐使用RestTemplateWebClient,它们更简单、更高效。

对于新的项目,除非有特殊要求,否则应优先考虑RESTful API的设计和调用方式。

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