创建一个简单的 JSON 对象
为了演示,我们首先需要一个 Java 对象(POJO),它将被序列化为 JSON,我们还会使用一个在线的测试 API(https://httpbin.org/post),它会返回我们发送给它的请求体,方便我们验证。

假设我们要发送一个用户信息:
User.java
// 一个简单的 POJO (Plain Old Java Object)
public class User {
private String name;
private int age;
private String[] hobbies;
// 无参构造函数是必要的,很多库依赖它
public User() {
}
public User(String name, int age, String[] hobbies) {
this.name = name;
this.age = age;
this.hobbies = hobbies;
}
// Getters and Setters (必须要有)
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
public String[] getHobbies() { return hobbies; }
public void setHobbies(String[] hobbies) { this.hobbies = hobbies; }
// (可选) 重写 toString() 方便打印和调试
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", hobbies=" + Arrays.toString(hobbies) +
'}';
}
}
使用 Java 11+ 的 HttpClient (推荐,现代标准)
从 Java 11 开始,java.net.http.HttpClient 成为官方标准,无需添加任何外部依赖,这是目前编写 Java HTTP 请求最推荐的方式。
特点:

- 标准库:无需任何第三方库。
- 异步支持:可以轻松实现异步请求。
- 现代 API:API 设计简洁、易用。
步骤:
- 创建
HttpClient实例。 - 创建请求体 (
HttpRequest.BodyPublishers),将 JSON 字符串写入。 - 构建
HttpRequest,设置方法、URL 和请求头。 - 发送请求并获取响应。
代码示例:
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;
import com.fasterxml.jackson.databind.ObjectMapper; // 需要添加 Jackson 依赖
public class Java11HttpClientPost {
public static void main(String[] args) {
// 1. 创建 HttpClient
HttpClient client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_2)
.connectTimeout(Duration.ofSeconds(10))
.build();
// 2. 准备要发送的 JSON 数据 (使用 Jackson 将对象转为 JSON 字符串)
User user = new User("张三", 30, new String[]{"编程", "阅读"});
ObjectMapper mapper = new ObjectMapper();
String jsonBody = null;
try {
jsonBody = mapper.writeValueAsString(user);
} catch (Exception e) {
e.printStackTrace();
return;
}
System.out.println("准备发送的 JSON: " + jsonBody);
// 3. 创建 HttpRequest
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://httpbin.org/post"))
.header("Content-Type", "application/json") // 设置内容类型为 JSON
.timeout(Duration.ofSeconds(15))
.POST(HttpRequest.BodyPublishers.ofString(jsonBody)) // 设置请求体
.build();
// 4. 发送请求并处理响应
try {
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
// 打印响应状态码
System.out.println("响应状态码: " + response.statusCode());
// 打印响应体 (httpbin.org 会返回我们发送的数据)
System.out.println("响应体: " + response.body());
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
如何运行:
你需要在你的项目中添加 Jackson 依赖来处理 JSON 序列化,如果你使用 Maven,在 pom.xml 中添加:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version> <!-- 使用最新版本 -->
</dependency>
使用 Apache HttpClient (经典选择)
Apache HttpClient 是一个功能强大、历史悠久的库,在 Java 8 甚至更早的时代被广泛使用。

特点:
- 功能强大:提供了比标准库更丰富的功能和更精细的控制。
- 稳定可靠:经过长期验证,非常稳定。
- 需要依赖:需要添加
org.apache.httpcomponents.client5包。
代码示例:
import org.apache.hc.client5.http.classic.methods.HttpPost;
import org.apache.hc.client5.http.entity.StringEntity;
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.HttpEntity;
import org.apache.hc.core5.http.io.entity.EntityUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
public class ApacheHttpClientPost {
public static void main(String[] args) {
// 1. 创建 HttpClient
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
// 2. 准备 JSON 数据
User user = new User("李四", 25, new String[]{"音乐", "旅行"});
ObjectMapper mapper = new ObjectMapper();
String jsonBody = mapper.writeValueAsString(user);
System.out.println("准备发送的 JSON: " + jsonBody);
// 3. 创建 HttpPost 请求
HttpPost httpPost = new HttpPost("https://httpbin.org/post");
httpPost.setHeader("Content-Type", "application/json");
httpPost.setEntity(new StringEntity(jsonBody, ContentType.APPLICATION_JSON));
// 4. 执行请求
try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
// 5. 处理响应
HttpEntity entity = response.getEntity();
System.out.println("响应状态码: " + response.getCode());
if (entity != null) {
String result = EntityUtils.toString(entity);
System.out.println("响应体: " + result);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
如何运行:
在 pom.xml 中添加以下依赖:
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
<version>5.3</version> <!-- 使用最新版本 -->
</dependency>
<dependency>
<groupId>org.apache.httpcomponents.core5</groupId>
<artifactId>httpcore5</artifactId>
<version>5.2</version> <!-- 使用最新版本 -->
</dependency>
<!-- 同样需要 Jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
使用 OkHttp (流行选择)
OkHttp 是另一个非常流行的 HTTP 客户端,以其高效和易用性著称,尤其在 Android 开发中是事实标准。
特点:
- 高性能:支持 HTTP/2 和连接池。
- 简洁的 API:代码可读性高。
- 需要依赖:需要添加
com.squareup.okhttp3包。
代码示例:
import okhttp3.*;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
public class OkHttpPost {
public static void main(String[] args) {
// 1. 创建 OkHttpClient
OkHttpClient client = new OkHttpClient();
// 2. 准备 JSON 数据
User user = new User("王五", 28, new String[]{"游戏", "电影"});
ObjectMapper mapper = new ObjectMapper();
String jsonBody = null;
try {
jsonBody = mapper.writeValueAsString(user);
} catch (Exception e) {
e.printStackTrace();
return;
}
System.out.println("准备发送的 JSON: " + jsonBody);
// 3. 创建 RequestBody
MediaType JSON = MediaType.parse("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)
.header("Content-Type", "application/json")
.build();
// 5. 发送请求并处理响应
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
// 打印响应状态码
System.out.println("响应状态码: " + response.code());
// 打印响应体
System.out.println("响应体: " + response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
}
如何运行:
在 pom.xml 中添加以下依赖:
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.12.0</version> <!-- 使用最新版本 -->
</dependency>
<!-- 同样需要 Jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
总结与选择
| 特性 | Java 11+ HttpClient | Apache HttpClient | OkHttp |
|---|---|---|---|
| 依赖 | 无需(JDK 自带) | 需要 | 需要 |
| 易用性 | 高 | 中等 | 高 |
| 功能 | 丰富(支持异步) | 非常丰富 | 丰富(性能好) |
| 性能 | 良好 | 良好 | 优秀(连接池) |
| 推荐场景 | 新项目,使用 Java 11+ | 遗留项目,或需要精细控制 | Android 项目,或追求高性能和简洁 API |
如何选择?
- 如果你使用的是 Java 11 或更高版本:强烈推荐使用
HttpClient,它是未来的方向,无需额外依赖,API 设计也很现代。 - 如果你在维护一个旧项目:并且已经在使用
Apache HttpClient,那么继续使用它是合理的,因为它非常稳定。 - 如果你在开发 Android 应用:OkHttp 是不二之选,因为它在 Android 生态中被深度集成和优化。
- 如果你开始一个新项目,但不想用 Java 11+ 的特性:OkHttp 是一个非常好的选择,它的 API 非常直观,性能也很好。
无论选择哪种方法,核心步骤都是一样的:
- 准备 JSON 数据 (通常用 Jackson/Gson 序列化 Java 对象)。
- 创建 HTTP 客户端。
- 构建 POST 请求,设置 URL、
Content-Type头和包含 JSON 的请求体。 - 发送请求并解析响应。
