使用 HttpClient (Java 11+)
从 Java 11 开始,java.net.http.HttpClient 被引入为标准库的一部分,这是目前官方推荐、功能最强大且最现代的方式,它支持 HTTP/1.1 和 HTTP/2,并且是异步友好的。

核心步骤
- 创建
HttpClient实例: 可以配置连接超时、代理等。 - 构建请求体: 将你的 Java 对象转换为 JSON 字符串,这通常需要借助第三方库,如 Jackson 或 Gson。
- 创建
HttpRequest: 设置请求方法 (POST)、URL、请求头 (Content-Type: application/json) 和请求体。 - 发送请求并获取响应: 使用
HttpClient.send()发送请求,并处理返回的HttpResponse。
完整代码示例
你需要一个 JSON 处理库,这里以 Jackson 为例,它是目前最流行、性能最好的 Java JSON 库。
Maven 依赖 (pom.xml):
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version> <!-- 使用最新版本 -->
</dependency>
Java 代码:
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
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 HttpClientPostExample {
// Jackson 的核心对象,用于序列化和反序列化
private static final ObjectMapper objectMapper = new ObjectMapper();
public static void main(String[] args) {
// 1. 目标 API 的 URL
String url = "https://jsonplaceholder.typicode.com/posts";
// 2. 准备要发送的 JSON 数据对应的 Java 对象
PostRequestData postData = new PostRequestData();
postData.setTitle("foo");
postData.setBody("bar");
postData.setUserId(1);
try {
// 3. 将 Java 对象转换为 JSON 字符串
String jsonBody = objectMapper.writeValueAsString(postData);
System.out.println("Request JSON Body: " + jsonBody);
// 4. 创建 HttpClient
HttpClient client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_2)
.connectTimeout(Duration.ofSeconds(10))
.build();
// 5. 创建 HttpRequest
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Content-Type", "application/json") // 设置 Content-Type 头
.POST(HttpRequest.BodyPublishers.ofString(jsonBody)) // 设置请求体
.build();
// 6. 发送请求并获取响应
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
// 7. 打印结果
System.out.println("Response Status Code: " + response.statusCode());
System.out.println("Response Body: " + response.body());
} catch (JsonProcessingException e) {
System.err.println("Error converting object to JSON: " + e.getMessage());
} catch (IOException | InterruptedException e) {
System.err.println("Error sending HTTP request: " + e.getMessage());
// 如果是线程中断,需要恢复中断状态
if (e instanceof InterruptedException) {
Thread.currentThread().interrupt();
}
}
}
// 定义一个与 JSON 结构匹配的 Java 类 (POJO)
static class PostRequestData {
private String title;
private String body;
private int userId;
// Getters and Setters (必须要有,Jackson 需要它们)
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
public String getBody() { return body; }
public void setBody(String body) { this.body = body; }
public int getUserId() { return userId; }
public void setUserId(int userId) { this.userId = userId; }
}
}
使用第三方库 OkHttp (非常流行)
OkHttp 是一个高效的 HTTP 客户端,在 Android 开发和 Java 后端服务中都非常流行,它易于使用,并且有强大的拦截器机制。

核心步骤
- 添加 OkHttp 和 Jackson 依赖。
- 创建
OkHttpClient实例。 - 构建请求体: 使用
RequestBody.create()和MediaType来创建 JSON 请求体。 - 创建
Request: 设置 URL、方法、头和请求体。 - 执行请求: 使用
client.newCall(request).execute()同步发送请求。
完整代码示例
Maven 依赖 (pom.xml):
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.11.0</version> <!-- 使用最新版本 -->
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
Java 代码:
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import okhttp3.*;
import java.io.IOException;
public class OkHttpPostExample {
private static final OkHttpClient client = new OkHttpClient();
private static final ObjectMapper objectMapper = new ObjectMapper();
private static final MediaType JSON = MediaType.get("application/json; charset=utf-8");
public static void main(String[] args) {
String url = "https://jsonplaceholder.typicode.com/posts";
PostRequestData postData = new PostRequestData();
postData.setTitle("okhttp-title");
postData.setBody("okhttp-body");
postData.setUserId(1);
try {
String jsonBody = objectMapper.writeValueAsString(postData);
System.out.println("Request JSON Body: " + jsonBody);
RequestBody body = RequestBody.create(jsonBody, JSON);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
// Response.body() is a one-time stream. Do not use it more than once.
String responseBody = response.body().string();
System.out.println("Response Status Code: " + response.code());
System.out.println("Response Body: " + responseBody);
}
} catch (JsonProcessingException e) {
System.err.println("Error converting object to JSON: " + e.getMessage());
} catch (IOException e) {
System.err.println("Error sending HTTP request: " + e.getMessage());
}
}
// 与 HttpClient 示例中相同的 PostRequestData 类
static class PostRequestData {
private String title;
private String body;
private int userId;
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
public String getBody() { return body; }
public void setBody(String body) { this.body = body; }
public int getUserId() { return userId; }
public void setUserId(int userId) { this.userId = userId; }
}
}
使用 Apache HttpClient (经典选择)
Apache HttpClient 是一个非常成熟和强大的库,在 Java 8 之前是事实上的标准,它功能非常全面,但配置相对复杂一些。
核心步骤
- 添加 Apache HttpClient 和 Jackson 依赖。
- 创建
CloseableHttpClient实例。 - 构建请求体: 使用
StringEntity包装 JSON 字符串。 - 创建
HttpPost: 设置 URL 和请求体。 - 执行请求: 使用
httpClient.execute()发送请求。
完整代码示例
Maven 依赖 (pom.xml):

<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
<version>5.2.1</version> <!-- 使用最新版本 -->
</dependency>
<dependency>
<groupId>org.apache.httpcomponents.core5</groupId>
<artifactId>httpcore5</artifactId>
<version>5.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
Java 代码:
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.hc.client5.http.classic.methods.HttpPost;
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.ContentType;
import org.apache.hc.core5.http.io.entity.StringEntity;
import org.apache.hc.core5.http.util.EntityUtils;
import java.io.IOException;
public class ApacheHttpClientPostExample {
private static final ObjectMapper objectMapper = new ObjectMapper();
public static void main(String[] args) {
String url = "https://jsonplaceholder.typicode.com/posts";
PostRequestData postData = new PostRequestData();
postData.setTitle("apache-title");
postData.setBody("apache-body");
postData.setUserId(1);
// 使用 try-with-resources 确保 HttpClient 和 HttpResponse 被正确关闭
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
String jsonBody;
try {
jsonBody = objectMapper.writeValueAsString(postData);
System.out.println("Request JSON Body: " + jsonBody);
} catch (JsonProcessingException e) {
System.err.println("Error converting object to JSON: " + e.getMessage());
return;
}
HttpPost httpPost = new HttpPost(url);
httpPost.setHeader("Content-Type", "application/json");
httpPost.setEntity(new StringEntity(jsonBody, ContentType.APPLICATION_JSON));
try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
// 获取响应体并转换为字符串
String responseBody = EntityUtils.toString(response.getEntity());
System.out.println("Response Status Code: " + response.getCode());
System.out.println("Response Body: " + responseBody);
}
} catch (IOException e) {
System.err.println("Error sending HTTP request: " + e.getMessage());
}
}
// 与前两个示例中相同的 PostRequestData 类
static class PostRequestData {
private String title;
private String body;
private int userId;
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
public String getBody() { return body; }
public void setBody(String body) { this.body = body; }
public int getUserId() { return userId; }
public void setUserId(int userId) { this.userId = userId; }
}
}
不使用第三方库 (Java 8+)
如果你不想引入任何外部依赖,可以使用 Java 8 引入的 java.net.http.HttpClient,但手动构建 JSON 字符串,这种方式不推荐用于复杂的生产环境,因为手动拼接 JSON 容易出错且难以维护。
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 ManualJsonPostExample {
public static void main(String[] args) {
String url = "https://jsonplaceholder.typicode.com/posts";
// 手动构建 JSON 字符串,注意转义双引号
String jsonBody = "{\"title\":\"manual-title\",\"body\":\"manual-body\",\"userId\":1}";
System.out.println("Request JSON Body: " + jsonBody);
HttpClient client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_2)
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(jsonBody))
.build();
try {
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Response Status Code: " + response.statusCode());
System.out.println("Response Body: " + response.body());
} catch (Exception e) {
e.printStackTrace();
}
}
}
总结与对比
| 特性 | Java 11+ HttpClient |
OkHttp | Apache HttpClient | 手动构建 |
|---|---|---|---|---|
| 依赖 | 无需额外依赖 (JDK自带) | okhttp |
httpclient5 |
无需额外依赖 |
| 易用性 | 简单 | 非常简单 | 较复杂 | 极其简单,但不推荐 |
| 功能 | 强大,支持 HTTP/2, 异步 | 强大,支持拦截器、WebSocket | 功能最全面 | 仅支持基本功能 |
| 性能 | 优秀 | 非常高 | 优秀 | N/A |
| 推荐场景 | 新项目,Java 11+ 环境 | 任何 Java 项目,尤其是 Android | 需要高级企业级功能时 | 快速测试、极简脚本 |
最终建议:
- 如果你使用 Java 11 或更高版本,首选 Java 11+
HttpClient,它是标准,性能好,且未来可期。 - 如果你使用 Java 8 或更早版本,或者需要 Android 支持,OkHttp 是最佳选择,它社区活跃,文档完善,使用体验极佳。
- 如果你需要非常复杂的 HTTP 功能(如高级重试策略、连接池精细控制等),可以考虑 Apache HttpClient。
- 尽量避免手动拼接 JSON,除非是在一个非常简单的脚本中临时使用。
