杰瑞科技汇

Java如何调用WebService方法?

调用 SOAP WebService (传统且最常见)

SOAP (Simple Object Access Protocol) 是一种基于 XML 的协议,通常通过 WSDL (Web Services Description Language) 文件来描述其接口,Java 中调用 SOAP WebService 主要有以下几种方式:

Java如何调用WebService方法?-图1
(图片来源网络,侵删)
  1. JAX-WS (Java API for XML Web Services):这是 Java 标准的、官方的 SOAP API,在 Java 6 及以上版本中,JAX-WS 已经被内置。
  2. Apache Axis2 / CXF:这些都是成熟的第三方框架,功能强大,但通常比标准的 JAX-WS 更复杂。

对于绝大多数情况,使用 JAX-WS 是最简单、最推荐的方式

方法 1:使用 JAX-WS (最推荐)

这种方法的核心是 wsimport 命令行工具,它会根据 WSDL 文件自动生成客户端所需的 Java 代码(如接口、服务类等),你只需要像调用本地方法一样调用即可。

步骤:

  1. 获取 WSDL 文件 找到你要调用的 WebService 的 WSDL 地址,http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl

    Java如何调用WebService方法?-图2
    (图片来源网络,侵删)
  2. 生成客户端代码 打开命令行(CMD 或 PowerShell),使用 wsimport 工具生成代码,你需要指定 WSDL 的地址和代码生成的目标目录。

    # -p: 指定生成的包名
    # -d: 指定生成的 .class 文件存放目录
    # -keep: 生成 .java 源文件,方便查看
    # -s: 指定生成的 .java 源文件存放目录 (如果不用 -keep, -s 也可以)
    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:服务接口
    • WeatherWebServiceService.java:服务工厂类
    • 以及一些用于数据传递的类(如 getWeatherbyCityName 等)。
  3. 编写 Java 代码调用 在你的 Java 项目中,引入生成的类,然后进行调用。

    package com.example.weather.client;
    public class WeatherClient {
        public static void main(String[] args) {
            // 1. 创建服务工厂类的实例
            WeatherWebServiceService service = new WeatherWebServiceService();
            // 2. 从工厂类中获取服务接口的实例
            WeatherWebService weatherWebService = service.getWeatherWebServicePort();
            // 3. 直接调用接口中的方法,就像调用本地方法一样
            // 注意:这里的方法名和参数需要根据生成的接口来定
            // 假设 WSDL 提供了一个 getWeather 方法
            // String[] result = weatherWebService.getWeather("北京", null);
            // 以 webxml.com 的天气查询为例
            String[] weatherInfo = weatherWebService.getWeatherbyCityName("上海");
            if (weatherInfo != null) {
                System.out.println("查询到的天气信息:");
                for (String info : weatherInfo) {
                    System.out.println(info);
                }
            } else {
                System.out.println("查询失败,未获取到天气信息。");
            }
        }
    }

优点:

Java如何调用WebService方法?-图3
(图片来源网络,侵删)
  • 标准化,是 Java 官方推荐的方式。
  • 开发简单,wsimport 自动生成大部分代码。
  • 与 Java 集成度高。

缺点:

  • 生成的代码可能比较冗长。
  • 依赖 Java 环境,生成的代码是强类型的。

方法 2:使用 Apache Axis2 (功能强大,配置稍复杂)

Axis2 是一个非常流行的 SOAP 框架,支持更高级的特性,但它比 JAX-WS 需要更多的配置。

步骤:

  1. 添加依赖 在你的 pom.xml (Maven) 中添加 Axis2 的依赖。

    <dependency>
        <groupId>org.apache.axis2</groupId>
        <artifactId>axis2</artifactId>
        <version>1.7.9</version> <!-- 使用较新稳定的版本 -->
    </dependency>
    <dependency>
        <groupId>org.apache.axis2</groupId>
        <artifactId>axis2-transport-http</artifactId>
        <version>1.7.9</version>
    </dependency>
  2. 编写调用代码 Axis2 可以通过代码动态地调用 WSDL,无需预先生成客户端代码。

    import org.apache.axis2.client.ServiceClient;
    import org.apache.axis2.addressing.EndpointReference;
    import org.apache.axis2.client.Options;
    public class Axis2WeatherClient {
        public static void main(String[] args) throws Exception {
            // 1. 定义 WSDL 的 URL
            String wsdlUrl = "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl";
            // 2. 定义要调用的方法名和命名空间
            // 命名空间通常可以在 WSDL 文件的 <service> 或 <portType> 标签中找到
            String action = "http://WebXml.com.cn/getWeatherbyCityName"; 
            String methodName = "getWeatherbyCityName";
            // 3. 创建 ServiceClient
            ServiceClient serviceClient = new ServiceClient();
            // 4. 设置目标服务的 EPR (Endpoint Reference)
            EndpointReference targetEPR = new EndpointReference(wsdlUrl.replace("?wsdl", ""));
            serviceClient.setOptions(new Options());
            serviceClient.getOptions().setTo(targetEPR);
            // 5. 设置 SOAP Action,这通常很重要
            serviceClient.getOptions().setAction(action);
            // 6. 准备参数
            // 参数是一个 Object 数组,顺序必须与 WSDL 中定义的顺序一致
            Object[] params = new Object[]{"上海"};
            // 7. 调用方法
            // 返回结果通常是 OMElement (AXIS Object Model) 对象
            org.apache.axiom.om.OMElement result = serviceClient.sendReceive(methodName, params);
            // 8. 处理结果
            System.out.println("AXIS2 查询结果 (XML 格式):");
            result.serialize(System.out); // 直接打印 XML
            // 如果需要将 OMElement 转换为 String 数组,需要额外的解析逻辑
            // String resultText = result.getText();
            // String[] weatherInfo = resultText.split(",");
            // ... 
        }
    }

优点:

  • 动态调用,无需生成客户端代码。
  • 功能强大,支持 WS-* 等标准。
  • 灵活性高。

缺点:

  • 配置相对复杂。
  • 需要引入额外的第三方库。

调用 RESTful WebService (现代主流)

RESTful WebService 通常基于 HTTP 协议,使用 JSON 或 XML 作为数据格式,调用方式更简单、轻量级,在 Java 中调用 RESTful 服务,最常用的是 HttpClientOkHttp 等库。

方法 1:使用 Java 11+ 的 HttpClient (推荐,现代且原生)

如果你使用的是 Java 11 或更高版本,可以直接使用内置的 HttpClient,无需额外依赖。

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpResponse.BodyHandlers;
import java.time.Duration;
public class Java11HttpClientExample {
    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 请求
        // 假设这是一个获取 JSON 数据的 REST API
        String apiUrl = "https://jsonplaceholder.typicode.com/posts/1";
        HttpRequest request = HttpRequest.newBuilder()
                .GET()
                .uri(URI.create(apiUrl))
                .header("Accept", "application/json") // 设置请求头,表示接受 JSON 响应
                .build();
        // 3. 发送请求并获取响应
        HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
        // 4. 处理响应
        System.out.println("状态码: " + response.statusCode());
        System.out.println("响应体 (JSON):");
        System.out.println(response.body());
    }
}

POST 请求示例:

// ... (HttpClient 创建同上)
// POST 请求
String postUrl = "https://jsonplaceholder.typicode.com/posts";
String jsonBody = "{\"title\":\"foo\",\"body\":\"bar\",\"userId\":
分享:
扫描分享到社交APP
上一篇
下一篇