使用 java.net.HttpURLConnection (JDK 内置)
这是最基础、最原始的方法,不需要任何额外的依赖,但它的 API 相对繁琐,不够现代化。

特点
- 优点: 无需引入外部库,JDK 自带。
- 缺点: 代码冗长,功能有限(如连接池、异步请求等需要自己实现),处理起来比较麻烦。
示例代码
这个例子演示了如何发送一个包含 JSON 数据的 POST 请求。
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 对象
String urlString = "https://jsonplaceholder.typicode.com/posts";
URL url = new URL(urlString);
// 2. 打开连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 3. 设置请求方法
connection.setRequestMethod("POST");
// 4. 设置请求头
connection.setRequestProperty("Content-Type", "application/json; utf-8");
connection.setRequestProperty("Accept", "application/json");
// 5. 允许输出流,因为我们要发送数据
connection.setDoOutput(true);
// 6. 准备要发送的 JSON 数据
String jsonInputString = "{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}";
// 7. 使用 try-with-resources 确保 DataOutputStream 被正确关闭
try (DataOutputStream out = new DataOutputStream(connection.getOutputStream())) {
out.writeBytes(jsonInputString);
out.flush();
}
// 8. 获取响应码
int responseCode = connection.getResponseCode();
System.out.println("POST Response Code: " + responseCode);
// 9. 读取响应内容
// 使用 try-with-resources 确保 BufferedReader 被正确关闭
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 body: " + response.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用 OkHttp (强烈推荐)
OkHttp 是目前最流行、功能最强大的 HTTP 客户端之一,它由 Square 公司开发,被广泛应用于 Android 和 Java 后端开发。
特点
- 优点: API 简洁易用,支持同步/异步请求,自动管理连接池,支持 GZIP 压缩,内置拦截器机制。
- 缺点: 需要引入第三方依赖。
添加依赖
如果你使用 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 OkHttpPostExample {
public static void main(String[] args) {
// 1. 创建 OkHttpClient 实例 (推荐单例模式)
OkHttpClient client = new OkHttpClient();
// 2. 准备请求体
String json = "{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}";
MediaType JSON = MediaType.get("application/json; charset=utf-8");
RequestBody body = RequestBody.create(json, JSON);
// 3. 构建请求
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);
}
// 获取响应体
String responseBody = response.body().string();
System.out.println("Response Code: " + response.code());
System.out.println("Response Body: " + responseBody);
} catch (IOException e) {
e.printStackTrace();
}
}
}
异步请求
异步请求不会阻塞调用线程,非常适合在 GUI 应用或高并发后端服务中使用。
import okhttp3.*;
import java.io.IOException;
public class OkHttpAsyncPostExample {
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
String json = "{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}";
MediaType JSON = MediaType.get("application/json; charset=utf-8");
RequestBody body = RequestBody.create(json, JSON);
Request request = new Request.Builder()
.url("https://jsonplaceholder.typicode.com/posts")
.post(body)
.build();
// 异步调用
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
// 请求失败
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
// 请求成功
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
String responseBody = response.body().string();
System.out.println("Response Code: " + response.code());
System.out.println("Response Body: " + responseBody);
}
});
// 因为 main 线程不会等待异步回调,所以这里让它休眠一会儿,以便看到结果
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
使用 Apache HttpClient (经典选择)
Apache HttpClient 是一个功能非常成熟的 HTTP 客户端库,历史悠久,功能强大,在 OkHttp 流行之前,它是 Java 生态中最主流的选择。
特点
- 优点: 功能极其丰富,稳定可靠,对 HTTP 协议的支持非常完善。
- 缺点: API 相对
OkHttp来说略显笨重,依赖包较大。
添加依赖
Maven (pom.xml):
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
<version>5.3.1</version> <!-- 请使用最新版本 -->
</dependency>
Gradle (build.gradle):
implementation 'org.apache.httpcomponents.client5:httpclient5:5.3.1' // 请使用最新版本
示例代码
import org.apache.hc.client5.http.classic.methods.HttpPost;
import org.apache.hc.client5.http.config.RequestConfig;
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 ApacheHttpClientPostExample {
public static void main(String[] args) {
// 1. 创建 HttpClient 实例
CloseableHttpClient httpClient = HttpClients.createDefault();
// 2. 创建 HttpPost 请求
HttpPost httpPost = new HttpPost("https://jsonplaceholder.typicode.com/posts");
// 3. 设置请求头
httpPost.setHeader("Accept", "application/json");
httpPost.setHeader("Content-Type", "application/json");
try {
// 4. 设置请求体
String json = "{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}";
StringEntity entity = new StringEntity(json);
httpPost.setEntity(entity);
// 5. 执行请求
CloseableHttpResponse response = httpClient.execute(httpPost);
try {
// 6. 获取响应状态码
System.out.println("Response Code: " + response.getCode());
// 7. 获取响应体
String responseBody = EntityUtils.toString(response.getEntity());
System.out.println("Response Body: " + responseBody);
} finally {
// 8. 确保响应体被完全消费并关闭
EntityUtils.consume(response.getEntity());
response.close();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 9. 关闭 HttpClient
try {
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
总结与对比
| 特性 | HttpURLConnection |
OkHttp |
Apache HttpClient |
|---|---|---|---|
| 依赖 | 无需 | 需要引入 okhttp |
需要引入 httpclient5 |
| API 易用性 | 差 | 好 | 一般 |
| 功能 | 基础 | 非常丰富 | 非常丰富 |
| 性能 | 一般 | 优秀 (连接池等) | 优秀 |
| 现代特性 | 支持 HTTP/1.1 | 支持 HTTP/2, SPDY | 支持 HTTP/1.1, HTTP/2 |
| 推荐场景 | 简单脚本、无法引入第三方库的项目 | 新项目、推荐首选,尤其适合 Android 和现代服务 | 遗留系统、需要高级 HTTP 协议特性的企业级应用 |
如何选择?
- 新手或新项目: 直接选择
OkHttp,它的 API 设计友好,性能卓越,社区活跃,文档齐全,是目前的不二之选。 - 无法引入外部库: 只能使用
HttpURLConnection,但要做好处理繁琐 API 的准备。 - 企业级/遗留系统: 如果项目已经在使用
Apache HttpClient或者有非常复杂的 HTTP 协议需求,可以继续使用它,它非常稳定可靠,但对于新项目,OkHttp通常是更好的选择。
