Java 生态中有几个主流的 HTTP Client 库,每个都有其特点和适用场景,我会从现代的官方推荐库开始,然后介绍其他非常流行的库。

Java 11+ 内置 java.net.http.HttpClient (官方推荐)
这是 Java 11 及更高版本中引入的官方 HTTP 客户端,它旨在成为一个现代、高效且功能齐全的替代方案,取代老旧的 HttpURLConnection。
核心特点
- 现代 API: 使用
java.net.http包,API 设计非常直观,基于Builder模式。 - 支持 HTTP/1.1 和 HTTP/2: 内置对 HTTP/2 的支持,可以更好地利用现代网络性能。
- 异步非阻塞: 这是其最大的亮点之一,它使用
java.util.concurrent.CompletableFuture实现异步请求,不会阻塞调用线程,非常适合高并发场景。 - 响应式编程支持: 可以与响应式流(
java.util.concurrent.Flow)无缝集成。 - WebSocket 支持: 内置了对 WebSocket 的客户端支持。
- 简洁易用: 相比一些第三方库,其 API 更为精简和标准化。
基本用法示例
同步 GET 请求
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class Java11HttpClientSyncExample {
public static void main(String[] args) throws Exception {
// 1. 创建 HttpClient 实例
HttpClient client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_2) // 指定 HTTP 版本
.connectTimeout(Duration.ofSeconds(10)) // 设置连接超时
.build();
// 2. 创建 HttpRequest 请求
HttpRequest request = HttpRequest.newBuilder()
.GET() // GET 请求
.uri(URI.create("https://jsonplaceholder.typicode.com/posts/1"))
.header("Accept", "application/json") // 设置请求头
.build();
// 3. 发送请求并获取响应 (这是同步调用,会阻塞)
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
// 4. 处理响应
System.out.println("Status Code: " + response.statusCode());
System.out.println("Response Body: " + response.body());
}
}
异步 GET 请求
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.concurrent.CompletableFuture;
public class Java11HttpClientAsyncExample {
public static void main(String[] args) {
// 1. 创建 HttpClient 实例
HttpClient client = HttpClient.newHttpClient();
// 2. 创建 HttpRequest 请求
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://jsonplaceholder.typicode.com/posts/1"))
.build();
// 3. 发送异步请求
CompletableFuture<HttpResponse<String>> futureResponse = client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
// 4. 处理异步响应
futureResponse.thenAccept(response -> {
System.out.println("Async Status Code: " + response.statusCode());
System.out.println("Async Response Body: " + response.body());
}).exceptionally(e -> {
System.err.println("Request failed: " + e.getMessage());
return null;
});
// 主线程需要等待,否则程序会立即退出,看不到异步结果
// 在实际应用中(如 Web 框架),主线程会处理其他任务
futureResponse.join(); // 等待异步任务完成
}
}
优点
- 官方标准: 无需添加第三方依赖,是 Java 生态系统的一部分。
- 性能优越: 异步和非阻塞特性使其在 I/O 密集型应用中性能卓越。
- 功能强大: 支持 HTTP/2 和 WebSocket。
缺点
- 版本要求: 需要 Java 11 或更高版本,对于仍在使用 Java 8 或更早版本的项目不适用。
Apache HttpClient (功能最全面的经典库)
Apache HttpClient 是一个历史悠久、功能极其强大的 HTTP 客户端库,它提供了对 HTTP 协议的深度支持,是企业级应用中非常流行的选择。

核心特点
- 功能极其丰富: 支持复杂的 HTTP 场景,如连接池、重试机制、Cookie 管理、认证(NTLM, SPNEGO)、代理等。
- 高度可定制: 几乎所有组件(
HttpClient,HttpContext,RequestConfig等)都可以进行深度定制。 - 稳定可靠: 经过长时间和大规模项目的检验,非常稳定。
- 社区活跃: 拥有庞大的用户社区和丰富的文档。
基本用法示例 (需要添加 Maven 依赖)
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
<version>5.3.1</version> <!-- 请使用最新版本 -->
</dependency>
<dependency>
<groupId>org.apache.httpcomponents.core5</groupId>
<artifactId>httpcore5</artifactId>
<version>5.2</version> <!-- 请使用最新版本 -->
</dependency>
import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.http.HttpEntity;
import org.apache.hc.core5.http.io.entity.EntityUtils;
public class ApacheHttpClientExample {
public static void main(String[] args) throws Exception {
// 1. 创建 HttpClient 实例 (内部使用连接池)
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
// 2. 创建 HttpGet 请求
HttpGet request = new HttpGet("https://jsonplaceholder.typicode.com/posts/1");
// 3. 执行请求
try (CloseableHttpResponse response = httpClient.execute(request)) {
// 4. 获取响应实体
HttpEntity entity = response.getEntity();
if (entity != null) {
// 将响应实体内容转换为字符串
String result = EntityUtils.toString(entity);
System.out.println("Status Code: " + response.getCode());
System.out.println("Response Body: " + result);
}
// 确保响应实体内容被完全消费,以便连接可以重用
EntityUtils.consume(entity);
}
} // try-with-resources 确保 HttpClient 和 HttpResponse 被正确关闭
}
}
优点
- 功能强大: 对 HTTP 协议的支持最全面,能满足最苛刻的需求。
- 稳定成熟: 长期以来的行业标准选择。
- 文档完善: 社区文档和示例非常丰富。
缺点
- API 较为繁琐: 相比 Java 11 HttpClient,其 API 更为冗长和复杂。
- 需要额外依赖: 必须将库添加到项目中。
OkHttp (移动端和后端的热门选择)
OkHttp 是一个由 Square 公司开发的、高效的 HTTP & HTTP/2 客户端,它在 Android 开发中是事实上的标准,同时在 Java 后端应用中也广受欢迎。
核心特点
- 高效: 默认使用 HTTP/2,支持连接池,减少了网络延迟。
- 简单易用: API 设计非常简洁和人性化。
- 自动重试: 对请求失败有内置的自动重试机制(对 idempotent 方法)。
- GZIP 压缩: 自动处理 GZIP 压缩,节省网络流量。
- 响应式 API: 支持回调和同步/异步调用。
基本用法示例 (需要添加 Maven 依赖)
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.12.0</version> <!-- 请使用最新版本 -->
</dependency>
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class OkHttpExample {
public static void main(String[] args) throws IOException {
// 1. 创建 OkHttpClient 实例 (它本身就是连接池)
OkHttpClient client = new OkHttpClient();
// 2. 创建 Request 请求
Request request = new Request.Builder()
.url("https://jsonplaceholder.typicode.com/posts/1")
.build();
// 3. 执行请求 (同步调用)
try (Response response = client.newCall(request).execute()) {
// 4. 处理响应
if (response.isSuccessful()) {
System.out.println("Status Code: " + response.code());
System.out.println("Response Body: " + response.body().string());
} else {
System.out.println("Request failed: " + response.code());
}
} // try-with-resources 确保 ResponseBody 被关闭
}
}
优点
- API 优雅: 设计非常直观,易于上手。
- 性能优秀: 连接池和 HTTP/2 支持使其性能出色。
- 社区活跃: 在移动和后端领域都非常流行。
缺点
- 需要额外依赖: 必须将库添加到项目中。
总结与如何选择
| 特性/库 | Java 11+ HttpClient |
Apache HttpClient | OkHttp |
|---|---|---|---|
| 所属 | Java 标准库 | Apache 基金会 | Square 公司 |
| Java 版本 | Java 11+ | Java 6+ | Java 8+ |
| API 风格 | 现代,简洁,基于 Builder | 经典,全面,可高度定制 | 简洁,流畅,人性化 |
| 核心优势 | 异步非阻塞,官方标准 | 功能最强大,稳定可靠 | API 优雅,性能优秀 |
| HTTP/2 支持 | 是 | 是 | 是 |
| 连接池 | 是 | 是 | 是 |
| 适用场景 | 新项目,使用 Java 11+,需要高性能异步 I/O | 企业级应用,需要复杂 HTTP 功能和深度定制 | Android 应用,追求简洁 API 和高性能的后端服务 |
| 是否需要依赖 | 否 | 是 | 是 |
选择建议
-
新项目,使用 Java 11+:
- 首选
java.net.http.HttpClient,它是未来的方向,无需额外依赖,并且其异步能力是原生优势。
- 首选
-
项目仍在使用 Java 8 或更早版本:
- 首选
OkHttp,它的 API 比 Apache HttpClient 更现代化,性能和易用性都很好。 - 如果项目对复杂 HTTP 功能(如特定认证、代理等)有硬性要求,可以考虑 Apache HttpClient。
- 首选
-
Android 开发:
(图片来源网络,侵删)- 毫无疑问选择
OkHttp,它是 Android 官方推荐的 HTTP 客户端,与 Retrofit 等库完美集成。
- 毫无疑问选择
-
企业级遗留系统或需要深度定制:
- Apache HttpClient 依然是可靠的选择,它的稳定性和功能深度是其核心竞争力。
