杰瑞科技汇

Java如何调用WebService?

  1. JAX-WS (Java API for XML Web Services)这是目前最主流、最推荐的方式,它是 Java 标准的一部分,用于创建和调用基于 SOAP (Simple Object Access Protocol) 的 WebService,它的工具支持非常好,可以自动生成客户端代码。
  2. Apache CXF / Axis2:这两个是流行的第三方框架,它们也支持 JAX-WS 标准,并且功能更强大、更灵活,是 JAX-WS 实现的佼佼者。
  3. Spring Boot + RestTemplate / WebClient:如果你的 WebService 是基于 RESTful 风格(使用 JSON/XML 等数据格式,通过 HTTP GET/POST 等方法调用),那么你完全不需要 SOAP 相关的工具,你可以直接使用 Spring 框架提供的 RestTemplate(传统)或 WebClient(响应式、现代)来调用,就像调用一个普通的 HTTP 接口一样。

下面我将重点讲解最常用的 JAX-WS 方式,并简要提及其他两种方式。

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

使用 JAX-WS (主流方式)

JAX-WS 调用 WebService 的标准流程是:

  1. 获取 WSDL 文件地址:WSDL (Web Services Description Language) 是 WebService 的“说明书”,描述了服务的地址、端口、可用的方法、参数和返回值类型等。
  2. 使用 wsimport 工具生成客户端代码:这是最关键的一步,JDK 自带的 wsimport 工具会根据 WSDL 文件,自动生成一系列 Java 类(包括服务接口、参数类、返回值类等)。
  3. 在 Java 代码中调用生成的服务:像调用本地 Java 对象一样,调用生成的服务接口。

详细步骤

第 1 步:准备工作

确保你已经安装了 JDK,JAVA_HOME 环境变量配置正确。wsimport 工具在 JDK 的 bin 目录下。

第 2 步:获取 WSDL 文件

假设我们要调用的 WebService 地址是:http://www.webxml.com.cn/webservices/weatherwebservice.asmx?wsdl

这个 URL 的 ?wsdl 参数就是告诉服务器返回 WSDL 描述文件。

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

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

打开你的命令行(CMD 或 PowerShell),切换到你希望存放生成代码的目录(D:\myproject\src\main\java),然后执行以下命令:

wsimport -keep -p com.example.client http://www.webxml.com.cn/webservices/weatherwebservice.asmx?wsdl

命令参数解释:

  • -keep:生成代码后,保留 .java 源文件,默认只生成 .class 文件。
  • -p com.example.client:指定生成的 Java 包名,你可以根据需要修改。
  • 最后的 URL WSDL 文件的地址。

执行成功后,你会看到在 com.example.client 包下生成了很多 .java 文件,其中最重要的是:

  • WeatherWebService.java:服务端点接口。
  • WeatherWebServiceService.java:服务,用于获取 WeatherWebService 接口的实例。
  • 以及各种用于封装请求参数和返回值的类(如 getWeatherCityName 等)。

第 4 步:在 Java 项目中调用生成的代码

你可以将这些生成的 Java 文件(或者直接编译后的 .jar 包)导入到你的 Java 项目中(如 Eclipse, IntelliJ IDEA, 或 Maven 项目),然后开始编写调用代码。

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

示例代码:

import com.example.client.WeatherWebService; // 生成的服务接口
import com.example.client.WeatherWebServiceService; // 生成的服务类
import com.example.client.ArrayOfString; // 生成的返回值类型
public class WebServiceClient {
    public static void main(String[] args) {
        try {
            // 1. 创建服务实例 (WeatherWebServiceService)
            //    通过 getDefaultPort() 方法获取服务端点接口 (WeatherWebService) 的实例
            WeatherWebServiceService service = new WeatherWebServiceService();
            WeatherWebService weatherWebService = service.getWeatherWebServicePort();
            // 2. 调用 WebService 提供的方法
            //    假设我们要查询 '北京' 的天气
            String cityName = "北京";
            ArrayOfString result = weatherWebService.getWeather(cityName, "");
            // 3. 处理返回结果
            //    getString() 方法返回一个包含天气信息的字符串列表
            java.util.List<String> weatherInfo = result.getString();
            System.out.println("===== " + cityName + " 的天气信息 =====");
            for (String info : weatherInfo) {
                System.out.println(info);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

第 5 步:处理 WebService 代理(可选,但很重要)

很多 WebService(尤其是企业内部的)运行在需要认证的代理服务器后面,如果你的 Java 程序需要通过代理才能访问外网,你需要在调用前设置系统属性:

// 在调用WebService之前设置
System.setProperty("http.proxyHost", "your.proxy.host");
System.setProperty("http.proxyPort", "8080");
// 如果代理需要认证
System.setProperty("http.proxyUser", "username");
System.setProperty("http.proxyPassword", "password");

使用 Apache CXF 框架

CXF 是一个非常强大的开源框架,它不仅实现了 JAX-WS 标准,还提供了很多高级功能,使用 CXF 可以让你更灵活地配置和调用 WebService。

步骤与 JAX-WS 类似,但生成客户端的工具是 cxf-codegen-plugin (通常在 Maven 项目中使用)。

  1. Maven 项目配置: 在你的 pom.xml 中添加 CXF 的 Maven 插件。

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-codegen-plugin</artifactId>
                <version>3.4.5</version> <!-- 使用合适的版本 -->
                <executions>
                    <execution>
                        <id>generate-sources</id>
                        <phase>generate-sources</phase>
                        <configuration>
                            <sourceRoot>${project.build.directory}/generated-sources/cxf</sourceRoot>
                            <wsdlOptions>
                                <wsdlOption>
                                    <wsdl>http://www.webxml.com.cn/webservices/weatherwebservice.asmx?wsdl</wsdl>
                                </wsdlOption>
                            </wsdlOptions>
                        </configuration>
                        <goals>
                            <goal>wsdl2java</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
  2. 执行生成: 在项目根目录运行 mvn generate-sources 命令,CXF 会自动生成客户端代码到 target/generated-sources/cxf 目录。

  3. 编写调用代码: 生成的代码和 JAX-WS 的结构类似,调用方式也基本一样。


调用 RESTful WebService (JSON/XML)

如果你的服务是 RESTful 风格,

  • URL: https://api.example.com/users/123
  • 方法: GET
  • 返回: {"id": 123, "name": "John Doe"}

那么你不需要 wsimport,直接使用 HTTP 客户端即可。Spring Boot 是目前最流行的选择

使用 Spring Boot 的 WebClient (推荐)

WebClient 是 Spring 5 引入的响应式、非阻塞的 HTTP 客户端,功能强大且现代。

  1. 添加依赖 (pom.xml):

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
  2. 编写调用代码:

    import org.springframework.web.reactive.function.client.WebClient;
    import reactor.core.publisher.Mono;
    public class RestClientExample {
        public static void main(String[] args) {
            // 1. 创建 WebClient 实例
            WebClient webClient = WebClient.create("https://api.example.com");
            // 2. 定义请求
            Mono<User> userMono = webClient.get()
                    .uri("/users/{id}", 123) // 设置URL和路径变量
                    .retrieve() // 执行请求并获取响应
                    .bodyToMono(User.class); // 将响应体解析为 User 对象
            // 3. 处理响应 (订阅并打印结果)
            userMono.subscribe(user -> {
                System.out.println("获取到用户: " + user.getName());
            });
            // 为了让异步调用能看到结果,主线程需要等待
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    // 假设的 User 类
    class User {
        private int id;
        private String name;
        // getters and setters
        public String getName() { return name; }
    }

总结与对比

特性 JAX-WS (SOAP) Spring Boot (RESTful)
适用场景 企业级、强类型、需要事务和安全性的服务。 公开 API、移动端、微服务间的轻量级通信。
协议 SOAP (基于 XML) HTTP (通常使用 JSON 或 XML)
优点 标准化、语言无关、功能强大(WS-Security, WS-Addressing等)。 简单、轻量、易于理解、与 Spring 生态无缝集成。
缺点 协议复杂、性能相对较低、调试困难。 功能相对简单,安全性等需要自己实现或依赖其他标准。
工具 wsimport (JDK自带), cxf-codegen-plugin (Maven) RestTemplate (同步), WebClient (异步)
调用方式 像调用本地 Java 方法一样。 像 HTTP 请求一样,明确指定 URL、方法、请求体等。

如何选择?

  • 如果你要调用的服务是一个传统的、基于 SOAP 的 WebService,并且提供了 WSDL 文件,JAX-WS 是你的不二之选
  • 如果你要调用的服务是现代的 RESTful API,或者你正在使用 Spring Boot 技术栈,那么直接使用 Spring Boot 的 WebClientRestTemplate 会更简单、更高效。
分享:
扫描分享到社交APP
上一篇
下一篇