杰瑞科技汇

Java客户端如何高效调用WebService?

  1. 基于SOAP (Simple Object Access Protocol) 的WebService:这是最传统、最标准的方式,通常通过WSDL (Web Services Description Language) 文档来描述服务的接口、方法、参数和返回值。
  2. 基于RESTful (Representational State Transfer) 的WebService:这是目前更流行、更轻量级的方式,本质上是HTTP协议的应用,通常返回JSON或XML数据。

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

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

调用传统的SOAP WebService (JAX-WS)

这种方式通常使用JAX-WS (Java API for XML Web Services) 规范,最简单的方法是使用JDK自带的 wsimport 工具生成客户端代码。

场景假设

我们要调用一个免费的公共WebService,比如中国天气网提供的获取天气信息的接口(这里我们用一个更简单的示例来演示)。

步骤 1:获取WSDL文件 WSDL文件是WebService的“说明书”,定义了所有可用的方法、参数和返回值,你需要提供WSDL文件的URL。 http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl

步骤 2:使用 wsimport 生成客户端代码 打开你的命令行(CMD或PowerShell),进入你想要生成代码的目录,然后执行以下命令:

Java客户端如何高效调用WebService?-图2
(图片来源网络,侵删)
# -p: 指定生成的包名
# -d: 指定生成的.class文件存放目录
# -keep: 生成.java源文件
wsimport -p com.example.weather.client -d ./src -keep http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl

执行成功后,你会在指定的目录下看到一堆 .java.class 文件,这些就是客户端代理代码。

步骤 3:在Java代码中调用生成的客户端 现在你可以在你的Java项目中使用这些生成的代码了。

生成的关键类:

  • WeatherWebService:服务端口,是调用服务的入口。
  • WeatherWebServiceSoap:具体的服务接口,包含了所有定义的方法(如 getWeather)。
  • getWeathergetWeatherResponse:分别对应请求和响应的对象。

示例代码:

Java客户端如何高效调用WebService?-图3
(图片来源网络,侵删)
package com.example.weather.client;
public class WeatherClient {
    public static void main(String[] args) {
        try {
            // 1. 创建服务视图 (Service)
            // WeatherWebService 是 wsimport 生成的类
            WeatherWebService service = new WeatherWebService();
            // 2. 获取服务端口 (Port)
            // WeatherWebServiceSoap 是 wsimport 生成的接口,包含了具体的方法
            WeatherWebServiceSoap port = service.getWeatherWebServiceSoap();
            // 3. 调用WebService方法 (传入参数)
            // 假设 getWeather 方法需要一个城市ID作为参数
            String cityCode = "北京"; // 这里使用城市名,具体看WSDL定义
            ArrayOfString result = port.getWeather(cityCode, "");
            // 4. 处理返回结果
            System.out.println("获取天气信息成功:");
            // 返回结果通常是一个列表
            java.util.List<String> weatherList = result.getString();
            for (String info : weatherList) {
                System.out.println(info);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

依赖管理: 使用 wsimport 生成的客户端是纯JDK代码,不需要任何额外的第三方库(如Axis, CXF等),只需要JDK环境即可,如果你使用Maven或Gradle,通常不需要添加额外依赖。


调用现代的RESTful WebService

RESTful服务通过HTTP请求(GET, POST, PUT, DELETE等)来操作资源,数据格式通常是JSON,在Java中,调用RESTful服务有多种方式,这里介绍最主流的两种。

场景假设

我们要调用一个公共的REST API,比如获取“随机笑话”。

API示例:

  • URL: https://v2.jokeapi.dev/joke/Any
  • 方法: GET
  • 返回格式: JSON

方法A:使用 java.net.HttpURLConnection (JDK原生)

这是最基础的方式,不依赖任何第三方库,适合简单的HTTP请求。

示例代码:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class RestClientWithHttpUrlConnection {
    public static void main(String[] args) {
        String apiUrl = "https://v2.jokeapi.dev/joke/Any";
        try {
            // 1. 创建URL对象
            URL url = new URL(apiUrl);
            // 2. 打开连接
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            // 3. 设置请求方法
            connection.setRequestMethod("GET");
            // 4. 设置请求头 (可选)
            connection.setRequestProperty("Accept", "application/json");
            // 5. 获取响应码
            int responseCode = connection.getResponseCode();
            System.out.println("Response Code: " + responseCode);
            if (responseCode == HttpURLConnection.HTTP_OK) { // 200
                // 6. 读取响应数据
                BufferedReader in = new BufferedReader(
                        new InputStreamReader(connection.getInputStream()));
                String inputLine;
                StringBuilder response = new StringBuilder();
                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();
                // 7. 打印结果 (原始JSON字符串)
                System.out.println("API Response:");
                System.out.println(response.toString());
                // 注意:这里只是打印原始JSON,实际项目中需要使用JSON库(如Gson, Jackson)来解析
                // 
                // Joke joke = new Gson().fromJson(response.toString(), Joke.class);
                // System.out.println("Joke: " + joke.getSetup());
            } else {
                System.out.println("GET request failed");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

方法B:使用 OkHttp (第三方库)

OkHttp 是目前Java(和Android)中最流行的HTTP客户端之一,它更高效、更易用。

步骤 1:添加依赖 如果你使用Maven,在 pom.xml 中添加:

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.12.0</version> <!-- 使用最新版本 -->
</dependency>

如果你使用Gradle,在 build.gradle 中添加:

implementation 'com.squareup.okhttp3:okhttp:4.12.0' // 使用最新版本

步骤 2:编写Java代码 OkHttp 提供了异步和同步两种调用方式。

示例代码 (同步调用):

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class RestClientWithOkHttp {
    public static void main(String[] args) {
        String apiUrl = "https://v2.jokeapi.dev/joke/Any";
        // 1. 创建OkHttpClient实例
        OkHttpClient client = new OkHttpClient();
        // 2. 创建请求对象
        Request request = new Request.Builder()
                .url(apiUrl)
                .get() // GET请求是默认的,可以不写
                .addHeader("Accept", "application/json")
                .build();
        try {
            // 3. 执行请求 (同步方式会阻塞线程)
            try (Response response = client.newCall(request).execute()) {
                if (!response.isSuccessful()) {
                    throw new RuntimeException("Request failed with code: " + response.code());
                }
                // 4. 获取响应体
                String responseBody = response.body().string();
                System.out.println("API Response:");
                System.out.println(responseBody);
                // 同样,这里需要用JSON库解析
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

示例代码 (异步调用): 异步调用不会阻塞主线程,适合在GUI应用或Web应用中使用。

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class RestClientAsyncWithOkHttp {
    public static void main(String[] args) {
        String apiUrl = "https://v2.jokeapi.dev/joke/Any";
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(apiUrl)
                .build();
        // 1. 异步执行请求
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                // 请求失败
                e.printStackTrace();
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                // 请求成功
                if (!response.isSuccessful()) {
                    throw new IOException("Unexpected code " + response);
                }
                // 2. 在回调中处理响应
                String responseBody = response.body().string();
                System.out.println("Async API Response:");
                System.out
分享:
扫描分享到社交APP
上一篇
下一篇