总结与推荐
| 方法 | 依赖 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|---|
Java 11+ HttpClient |
无外部依赖 (JDK自带) | 现代化、异步支持、API简洁、性能好 | 需要Java 11或更高版本 | 新项目首选,特别是Java 11+环境 |
| OkHttp | okhttp (第三方库) |
功能强大、性能优异、文档完善、社区活跃 | 需要添加Maven/Gradle依赖 | 需要高性能、复杂网络操作(如拦截器)的项目 |
| Apache HttpClient | httpclient (第三方库) |
功能全面、历史悠久、稳定可靠 | API相对繁琐、依赖较多 | 旧项目或已经在使用Apache生态系统的项目 |
传统 HttpURLConnection |
无外部依赖 (JDK自带) | JDK内置,无需任何配置 | API繁琐、同步阻塞、功能简单 | 非常简单的请求,且无法引入第三方库的极端情况 |
Java 11+ HttpClient (推荐)
这是 Java 官方自带的现代 HTTP 客户端,从 Java 11 开始成为标准,它支持同步和异步请求,API 设计得非常现代化。

添加依赖
无需任何外部依赖! 只要你的项目使用 Java 11 或更高版本,HttpClient 已经包含在 JDK 中。
同步 POST 请求示例
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.util.HashMap;
import java.util.Map;
public class Java11HttpClientPostSync {
public static void main(String[] args) {
// 1. 创建 HttpClient 实例
HttpClient client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_2) // 指定HTTP版本
.connectTimeout(Duration.ofSeconds(10)) // 设置连接超时
.build();
// 2. 准备请求体 (JSON)
String jsonBody = "{\"name\":\"张三\", \"age\":30, \"city\":\"北京\"}";
// 3. 构建 HttpRequest
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://jsonplaceholder.typicode.com/posts")) // 示例API
.header("Content-Type", "application/json") // 设置Content-Type头
.header("Accept", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(jsonBody)) // 设置POST请求体
.build();
try {
// 4. 发送请求并获取响应
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
// 5. 打印结果
System.out.println("状态码: " + response.statusCode());
System.out.println("响应头: " + response.headers());
System.out.println("响应体: " + response.body());
} catch (Exception e) {
e.printStackTrace();
}
}
}
异步 POST 请求示例
异步请求不会阻塞主线程,适合高并发场景。
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 Java11HttpClientPostAsync {
public static void main(String[] args) {
// 1. 创建 HttpClient
HttpClient client = HttpClient.newHttpClient();
// 2. 准备请求体 (Form Data)
// 对于表单数据,可以直接拼接成 "key1=value1&key2=value2" 的字符串
String formData = "username=testuser&password=123456";
// 3. 构建 HttpRequest
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://httpbin.org/post")) // 一个用于测试的API
.header("Content-Type", "application/x-www-form-urlencoded")
.POST(HttpRequest.BodyPublishers.ofString(formData))
.build();
// 4. 发送异步请求
CompletableFuture<HttpResponse<String>> futureResponse = client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
// 5. 处理响应 (使用thenAccept)
futureResponse.thenAccept(response -> {
System.out.println("状态码: " + response.statusCode());
System.out.println("响应体: " + response.body());
}).exceptionally(e -> { // 处理异常
System.err.println("请求失败: " + e.getMessage());
return null;
});
// 为了让主线程等待异步任务完成(在实际应用中,服务器框架会处理)
futureResponse.join();
}
}
OkHttp (流行第三方库)
OkHttp 是目前最流行的 HTTP 客户端之一,以其高性能和易用性著称。
添加依赖 (Maven)
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.12.0</version> <!-- 请使用最新版本 -->
</dependency>
POST 请求示例 (JSON)
import okhttp3.*;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
public class OkHttpPostExample {
private static final MediaType JSON = MediaType.get("application/json; charset=utf-8");
public static void main(String[] args) {
// 1. 创建 OkHttpClient 实例
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build();
// 2. 准备请求体
String jsonBody = "{\"name\":\"李四\", \"age\":25}";
RequestBody body = RequestBody.create(jsonBody, JSON);
// 3. 构建 Request
Request request = new Request.Builder()
.url("https://jsonplaceholder.typicode.com/posts")
.post(body)
.build();
// 4. 发送请求并获取响应
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
// 5. 打印结果
System.out.println("状态码: " + response.code());
System.out.println("响应体: " + response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
}
Apache HttpClient (传统稳定)
Apache HttpClient 是一个历史悠久、功能非常强大的 HTTP 组件库。

添加依赖 (Maven)
通常需要 httpclient 和 httpcore 两个核心包。
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.14</version> <!-- 请使用最新版本 -->
</dependency>
POST 请求示例 (JSON)
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
public class ApacheHttpClientPostExample {
public static void main(String[] args) {
// 1. 创建 HttpClient 实例
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
// 2. 创建 HttpPost 请求对象
HttpPost httpPost = new HttpPost("https://jsonplaceholder.typicode.com/posts");
// 3. 设置请求头
httpPost.setHeader("Content-Type", "application/json");
httpPost.setHeader("Accept", "application/json");
// 4. 设置请求体
String jsonBody = "{\"name\":\"王五\", \"age\":40}";
StringEntity entity = new StringEntity(jsonBody);
httpPost.setEntity(entity);
// 5. 执行请求并获取响应
try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
// 6. 获取响应实体
HttpEntity responseEntity = response.getEntity();
String responseString = EntityUtils.toString(responseEntity);
// 7. 打印结果
System.out.println("状态码: " + response.getStatusLine().getStatusCode());
System.out.println("响应体: " + responseString);
// 确保响应内容被完全消费,以便连接可以被重用
EntityUtils.consume(responseEntity);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
传统 HttpURLConnection (不推荐)
这是 JDK 最原始的 HTTP 客户端,不推荐在新项目中使用,因为它非常繁琐且功能有限。
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpURLConnectionPostExample {
public static void main(String[] args) {
try {
// 1. 创建 URL 对象
URL url = new URL("https://jsonplaceholder.typicode.com/posts");
// 2. 打开连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 3. 设置请求方法
connection.setRequestMethod("POST");
// 4. 设置请求头
connection.setRequestProperty("Content-Type", "application/json");
connection.setRequestProperty("Accept", "application/json");
// 5. 启用输出流
connection.setDoOutput(true);
// 6. 写入请求体
String jsonBody = "{\"name\":\"赵六\", \"age\":50}";
try (DataOutputStream out = new DataOutputStream(connection.getOutputStream())) {
out.writeBytes(jsonBody);
out.flush();
}
// 7. 获取响应码
int responseCode = connection.getResponseCode();
System.out.println("状态码: " + responseCode);
// 8. 读取响应
if (responseCode == HttpURLConnection.HTTP_OK) { // 200
try (BufferedReader in = new BufferedReader(
new InputStreamReader(connection.getInputStream()))) {
String inputLine;
StringBuilder response = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
System.out.println("响应体: " + response.toString());
}
} else {
System.out.println("POST请求失败");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
如何选择?
- 新项目,使用 Java 11+:直接使用
HttpClient,这是最现代、最官方、最不需要配置的方案。 - 新项目,Java 版本较低 (如 Java 8):使用 OkHttp,它提供了与
HttpClient类似的简洁 API 和出色的性能。 - 维护旧项目:如果项目已经在使用 Apache HttpClient,就继续使用它,保持技术栈统一,否则,可以考虑升级到 OkHttp。
- 无法引入任何第三方库:这是最糟糕的情况,只能使用
HttpURLConnection,请尽快评估是否可以升级依赖。
