- 基于SOAP (Simple Object Access Protocol) 的WebService:这是最传统、最标准的方式,通常通过WSDL (Web Services Description Language) 文档来描述服务的接口、方法、参数和返回值。
- 基于RESTful (Representational State Transfer) 的WebService:这是目前更流行、更轻量级的方式,本质上是HTTP协议的应用,通常返回JSON或XML数据。
下面我将分别详细介绍这两种方式的实现方法,并提供完整的代码示例。

调用传统的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),进入你想要生成代码的目录,然后执行以下命令:

# -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)。getWeather和getWeatherResponse:分别对应请求和响应的对象。
示例代码:

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 