创建一个简单的测试 API
为了演示,我们使用一个公共的测试 API:JSONPlaceholder,我们将向其发送一个 POST 请求,创建一个新的 "todo" 项目。

请求信息:
- URL:
https://jsonplaceholder.typicode.com/todos - 方法:
POST - 请求头:
Content-Type: application/json - 请求体 (JSON):
{ "title": "学习 Java HTTP 请求", "body": "这是一个关于如何发送 JSON 请求的教程", "userId": 1 }
使用 HttpURLConnection (JDK 内置)
这是最基础的方法,不需要引入任何第三方库,但它的代码相对繁琐,且功能较弱。
代码示例
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpURLConnectionExample {
public static void main(String[] args) {
// 1. 目标 URL
String urlString = "https://jsonplaceholder.typicode.com/todos";
String jsonInputString = "{\n" +
" \"title\": \"学习 Java HTTP 请求\",\n" +
" \"body\": \"这是一个关于如何发送 JSON 请求的教程\",\n" +
" \"userId\": 1\n" +
"}";
try {
// 2. 创建 URL 对象
URL url = new URL(urlString);
// 3. 打开连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 4. 设置请求方法
connection.setRequestMethod("POST");
// 5. 设置请求头
connection.setRequestProperty("Content-Type", "application/json; utf-8");
connection.setRequestProperty("Accept", "application/json");
// 允许输出
connection.setDoOutput(true);
// 6. 发送请求体
try (OutputStream os = connection.getOutputStream()) {
byte[] input = jsonInputString.getBytes("utf-8");
os.write(input, 0, input.length);
}
// 7. 获取响应码
int responseCode = connection.getResponseCode();
System.out.println("响应码: " + responseCode);
// 8. 读取响应
StringBuilder response = new StringBuilder();
// 根据响应码决定使用哪个输入流
try (BufferedReader br = new BufferedReader(
new InputStreamReader(responseCode < 400 ? connection.getInputStream() : connection.getErrorStream(), "utf-8"))) {
String responseLine;
while ((responseLine = br.readLine()) != null) {
response.append(responseLine.trim());
}
}
// 9. 输出结果
System.out.println("响应内容: " + response.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
}
优缺点:
- 优点: 无需依赖,JDK 自带。
- 缺点: 代码冗长,处理复杂请求(如文件上传、连接池)非常麻烦,不支持异步请求。
使用 OkHttp (推荐)
OkHttp 是目前最流行的 HTTP 客户端之一,由 Square 公司开发,它功能强大、性能优异、API 设计简洁,支持同步和异步请求。

添加依赖
如果你使用 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' // 请使用最新版本
代码示例
OkHttp 通常与 Okio 和 Moshi/Gson 等库结合使用来处理 JSON,这里我们直接使用字符串。
import okhttp3.*;
import java.io.IOException;
public class OkHttpExample {
public static void main(String[] args) {
// 1. 创建 OkHttp 客户端
OkHttpClient client = new OkHttpClient();
// 2. 准备 JSON 请求体
String json = "{\n" +
" \"title\": \"学习 OkHttp\",\n" +
" \"body\": \"OkHttp 是一个优秀的 HTTP 客户端\",\n" +
" \"userId\": 1\n" +
"}";
// 3. 创建 RequestBody,指定内容类型为 JSON
RequestBody body = RequestBody.create(json, MediaType.parse("application/json; charset=utf-8"));
// 4. 构建请求
Request request = new Request.Builder()
.url("https://jsonplaceholder.typicode.com/todos")
.post(body) // 设置 POST 请求体
.addHeader("Accept", "application/json")
.build();
// 5. 发送请求并获取响应
try (Response response = client.newCall(request).execute()) {
// 6. 检查响应是否成功
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
// 7. 获取响应体
String responseBody = response.body().string();
System.out.println("响应码: " + response.code());
System.out.println("响应内容: " + responseBody);
} catch (IOException e) {
e.printStackTrace();
}
}
}
优缺点:

- 优点: API 简洁易用,性能高(支持连接池、GZIP),支持同步/异步,功能全面(WebSocket、拦截器等)。
- 缺点: 需要引入第三方库。
使用 Apache HttpClient (经典选择)
Apache HttpClient 是一个功能非常成熟和强大的 HTTP 组件库,在企业级应用中广泛使用。
添加依赖
如果你使用 Maven,在 pom.xml 中添加:
<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>
注意:httpclient5 依赖 httpcore5。
代码示例
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.io.entity.EntityUtils;
import org.apache.hc.core5.http.io.entity.StringEntity;
import java.io.IOException;
public class ApacheHttpClientExample {
public static void main(String[] args) {
// 1. 创建 HttpClient 实例
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
// 2. 创建 HttpPost 请求
HttpPost httpPost = new HttpPost("https://jsonplaceholder.typicode.com/todos");
// 3. 准备 JSON 请求体
String json = "{\n" +
" \"title\": \"学习 Apache HttpClient\",\n" +
" \"body\": \"这是一个经典的 HTTP 客户端库\",\n" +
" \"userId\": 1\n" +
"}";
// 4. 设置请求体和内容类型
StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
httpPost.setEntity(entity);
// 5. 执行请求
System.out.println("发送请求...");
try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
// 6. 获取响应状态码
System.out.println("响应码: " + response.getCode());
// 7. 获取响应内容
String responseBody = EntityUtils.toString(response.getEntity());
System.out.println("响应内容: " + responseBody);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
优缺点:
- 优点: 功能极其强大和稳定,配置灵活,在企业级项目中经过长期验证。
- 缺点: API 相对
OkHttp稍显复杂,依赖包较大。
使用 RestTemplate (Spring 生态)
如果你已经在使用 Spring 或 Spring Boot 框架,RestTemplate 是一个非常方便的选择。
添加依赖 (Spring Boot 项目通常已包含)
代码示例
import org.springframework.http.*;
import org.springframework.web.client.RestTemplate;
public class RestTemplateExample {
public static void main(String[] args) {
// 1. 创建 RestTemplate 实例
RestTemplate restTemplate = new RestTemplate();
// 2. 设置请求头
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
// 3. 准备请求体
String json = "{\n" +
" \"title\": \"学习 RestTemplate\",\n" +
" \"body\": \"Spring 生态中的 HTTP 客户端\",\n" +
" \"userId\": 1\n" +
"}";
// 4. 构建 HttpEntity 对象
HttpEntity<String> entity = new HttpEntity<>(json, headers);
// 5. 设置 URL
String url = "https://jsonplaceholder.typicode.com/todos";
// 6. 发送 POST 请求并映射返回结果到 Todo 类 (可选)
// 为了简单,这里直接获取 String
ResponseEntity<String> response = restTemplate.postForEntity(url, entity, String.class);
// 7. 输出结果
System.out.println("响应码: " + response.getStatusCode());
System.out.println("响应头: " + response.getHeaders());
System.out.println("响应内容: " + response.getBody());
}
// 可以定义一个与 JSON 结构匹配的类
static class Todo {
private int id;
private int userId;
private String title;
private String body;
private boolean completed;
// Getters and Setters...
}
}
优缺点:
- 优点: 与 Spring 框架无缝集成,支持直接将 JSON 映射到 Java 对象,API 高度封装。
- 缺点: 严重依赖 Spring 生态,不适用于非 Spring 项目,在 Spring Boot 3.2+ 中已被
WebClient标记为不推荐使用。
总结与如何选择
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| HttpURLConnection | 无需依赖,JDK 自带 | 代码繁琐,功能弱 | 简单的脚本、小型项目、无法引入第三方库的环境 |
| OkHttp | API 简洁,性能高,功能全面 | 需要引入第三方库 | 大多数 Java 应用,尤其是 Android 开发和现代微服务 |
| Apache HttpClient | 功能强大、稳定、成熟 | API 略显复杂,依赖较大 | 企业级应用、需要高度定制和稳定性的传统项目 |
| RestTemplate | 与 Spring 集成好,支持对象映射 | 依赖 Spring,已被 WebClient 取代 |
正在使用 Spring 框架的老项目 |
推荐选择:
- 新项目:优先选择 OkHttp,它在易用性、性能和社区活跃度上都表现出色。
- Spring Boot 项目:如果你使用的是较新版本的 Spring Boot,推荐学习并使用
WebClient(异步、非阻塞);如果是在旧项目中,RestTemplate仍然可用。 - 企业级/传统项目:Apache HttpClient 是一个非常可靠和成熟的选择。
- 简单/无依赖需求:使用
HttpURLConnection,但通常不推荐用于复杂的业务逻辑。
