- 使用
HttpURLConnection(JDK 内置) - 最基础,无需额外依赖,但代码较繁琐。 - 使用
HttpClient(Java 11+ 内置) - 现代、官方推荐,功能强大且易用。 - 使用第三方库
OkHttp(流行且强大) - 社区广泛使用,功能非常丰富。
准备工作:创建一个用于测试的 API 服务
为了演示 POST 请求,我们需要一个能接收请求并返回响应的 API,你可以使用一个在线的测试工具,httpbin.org。

它提供了一个非常方便的 POST 接口:https://httpbin.org/post,当你向它发送 POST 请求时,它会返回你发送的请求头、请求体等信息,非常适合调试和学习。
使用 HttpURLConnection (JDK 内置)
这是 Java 标准库自带的,不需要添加任何依赖,它的 API 比较老旧,代码量较多,手动处理流、编码等也比较麻烦。
示例代码
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
public class PostWithHttpURLConnection {
public static void main(String[] args) throws Exception {
// 1. 目标 URL
String urlString = "https://httpbin.org/post";
URL url = new URL(urlString);
// 2. 打开连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/json; utf-8");
connection.setRequestProperty("Accept", "application/json");
connection.setDoOutput(true); // 允许发送请求体
// 3. 准备要发送的 JSON 数据
String jsonInputString = "{\"name\": \"John Doe\", \"job\": \"Software Engineer\"}";
// 4. 发送请求体
try (DataOutputStream out = new DataOutputStream(connection.getOutputStream())) {
out.write(jsonInputString.getBytes(StandardCharsets.UTF_8));
out.flush();
}
// 5. 获取响应码
int responseCode = connection.getResponseCode();
System.out.println("POST Response Code : " + responseCode);
// 6. 读取响应内容
StringBuilder response = new StringBuilder();
if (responseCode == HttpURLConnection.HTTP_OK) { // 200
try (BufferedReader in = new BufferedReader(
new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) {
String inputLine;
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
}
System.out.println("Response body: " + response.toString());
} else {
System.out.println("POST request did not work.");
}
}
}
优缺点:
- 优点: 无需任何外部库,是 Java 的标准功能。
- 缺点: 代码冗长,需要手动处理很多细节(如流、编码、错误码等),不推荐在新项目中使用。
使用 HttpClient (Java 11+ 推荐)
从 Java 11 开始,java.net.http 包被引入,提供了现代化的 HttpClient API,这是目前官方推荐的方式,代码简洁,支持异步请求,功能强大。

示例代码
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 PostWithHttpClient {
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. 准备要发送的 JSON 数据
String jsonBody = "{\"name\": \"Jane Doe\", \"job\": \"Project Manager\"}";
// 3. 创建 HttpRequest
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://httpbin.org/post"))
.header("Content-Type", "application/json")
.timeout(Duration.ofSeconds(5))
.POST(HttpRequest.BodyPublishers.ofString(jsonBody))
.build();
// 4. 发送请求并获取响应
// 同步发送
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
// 5. 处理响应
System.out.println("Status Code: " + response.statusCode());
System.out.println("Response Body: " + response.body());
}
}
优缺点:
- 优点: 现代、简洁、功能强大(内置支持异步、WebSocket),是 Java 的官方标准。
- 缺点: 需要 Java 11 或更高版本。
使用 OkHttp (第三方库)
OkHttp 是一个由 Square 公司维护的开源项目,是目前 Java 生态中最流行的 HTTP 客户端之一,它非常高效,易于使用,并且提供了丰富的功能。
添加依赖
你需要在你的项目中添加 OkHttp 的依赖。
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' // 请使用最新版本
示例代码
import okhttp3.*;
import java.io.IOException;
public class PostWithOkHttp {
public static void main(String[] args) {
// 1. 创建 OkHttpClient 实例
OkHttpClient client = new OkHttpClient();
// 2. 准备要发送的 JSON 数据
String jsonBody = "{\"name\": \"Peter Jones\", \"job\": \"Data Scientist\"}";
// 3. 创建 RequestBody
MediaType JSON = MediaType.get("application/json; charset=utf-8");
RequestBody body = RequestBody.create(jsonBody, JSON);
// 4. 创建 Request
Request request = new Request.Builder()
.url("https://httpbin.org/post")
.post(body)
.build();
// 5. 发送请求并获取响应
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
// 获取响应体
String responseBody = response.body().string();
System.out.println("Status Code: " + response.code());
System.out.println("Response Body: " + responseBody);
} catch (IOException e) {
e.printStackTrace();
}
}
}
优缺点:
- 优点: API 非常直观易用,性能优异,社区活跃,插件丰富(如支持拦截器)。
- 缺点: 需要引入第三方库。
总结与对比
| 特性 | HttpURLConnection |
HttpClient (Java 11+) |
OkHttp |
|---|---|---|---|
| 依赖 | 无需,JDK 内置 | 无需,JDK 11+ 内置 | 需要添加 okhttp 依赖 |
| 易用性 | 差,代码繁琐 | 好,API 现代 | 非常好,API 简洁直观 |
| 功能 | 基础 | 强大,支持异步/同步 | 非常强大,支持拦截器、重试、连接池等 |
| 性能 | 一般 | 高 | 非常高 |
| 推荐场景 | 旧项目、无法引入依赖的极简环境 | 新项目的首选,尤其是 Java 11+ 环境 | 需要高级功能(如拦截器)或追求极致易用性的项目 |
如何选择?
- 如果你使用 Java 11 或更高版本,并且是开发新项目:强烈推荐使用
HttpClient,它是未来的方向,无需额外依赖,且功能足够强大。 - 如果你使用的是 Java 11 以下的版本,或者项目已经广泛使用了 OkHttp:继续使用
OkHttp是一个非常好的选择,它的生态和易用性都无懈可击。 - 如果你在一个非常受限的环境(如某些嵌入式系统)中,无法添加任何库:那么只能使用
HttpURLConnection,但请做好处理繁琐代码的准备。
