目录
-
Java 内置方式:
HttpURLConnection
(图片来源网络,侵删)- 简介
- GET 请求示例
- POST 请求示例
- 优缺点
-
现代首选:
OkHttp- 简介
- 添加依赖
- GET 请求示例
- POST 请求示例(发送 JSON 和文件)
- 优缺点
-
经典强大:
Apache HttpClient- 简介
- 添加依赖
- GET 请求示例
- POST 请求示例
- 优缺点
-
总结与对比
Java 内置方式:HttpURLConnection
HttpURLConnection 是 Java 标准库 (java.net) 自带的一个类,无需引入任何外部依赖,它功能相对基础,足以应对简单的 HTTP 请求。

简介
直接使用 JDK 提供的 API,轻量级,适合不希望引入第三方库的简单项目。
GET 请求示例
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpURLConnectionGetExample {
public static void main(String[] args) {
try {
// 1. 创建 URL 对象
String urlString = "https://jsonplaceholder.typicode.com/posts/1";
URL url = new URL(urlString);
// 2. 打开连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 3. 设置请求方法
connection.setRequestMethod("GET");
// 4. 设置请求头 (可选)
connection.setRequestProperty("User-Agent", "MyJavaApp/1.0");
// 5. 获取响应码
int responseCode = connection.getResponseCode();
System.out.println("Response Code: " + responseCode);
// 6. 读取响应数据
if (responseCode == HttpURLConnection.HTTP_OK) { // 200
BufferedReader in = new BufferedReader(
new InputStreamReader(connection.getInputStream()));
String inputLine;
StringBuilder response = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
// 打印结果
System.out.println("Response Body: " + response.toString());
} else {
System.out.println("GET request failed");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
POST 请求示例
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpURLConnectionPostExample {
public static void main(String[] args) {
try {
String urlString = "https://jsonplaceholder.typicode.com/posts";
URL url = new URL(urlString);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 1. 设置请求方法为 POST
connection.setRequestMethod("POST");
// 2. 设置 DoOutput 为 true,表示将向连接输出数据
connection.setDoOutput(true);
// 3. 设置请求头
connection.setRequestProperty("Content-Type", "application/json; utf-8");
connection.setRequestProperty("Accept", "application/json");
// 4. 准备要发送的 JSON 数据
String jsonInputString = "{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}";
// 5. 发送请求体
try (OutputStream os = connection.getOutputStream()) {
byte[] input = jsonInputString.getBytes("utf-8");
os.write(input, 0, input.length);
}
// 6. 获取响应码
int responseCode = connection.getResponseCode();
System.out.println("Response Code: " + responseCode);
// 读取响应的逻辑与 GET 类似...
if (responseCode == HttpURLConnection.HTTP_CREATED || responseCode == HttpURLConnection.HTTP_OK) { // 201 or 200
// ... (省略读取响应的代码)
System.out.println("POST request successful");
} else {
System.out.println("POST request failed");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
优缺点
- 优点:
- 无需依赖,JDK 自带。
- 轻量级。
- 缺点:
- API 相对繁琐,代码量大。
- 功能有限,例如不支持异步请求、连接池等高级特性。
- 处理 JSON、文件等复杂数据时非常不便。
现代首选:OkHttp
OkHttp 是目前 Java (以及 Android) 开发中最流行的 HTTP 客户端,它由 Square 公司(著名的开源公司)开发,以其高效、简洁和强大的功能而闻名。
简介
一个现代的、高效的 HTTP 客户端,支持同步和异步请求、自动重试、连接池、GZIP 压缩等。
添加依赖 (Maven)
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.12.0</version> <!-- 请使用最新版本 -->
</dependency>
GET 请求示例
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class OkHttpGetExample {
public static void main(String[] args) {
// 1. 创建 OkHttp 客户端 (推荐使用单例模式)
OkHttpClient client = new OkHttpClient();
// 2. 创建请求
Request request = new Request.Builder()
.url("https://jsonplaceholder.typicode.com/posts/1")
.get() // 显式指定 GET 方法 (可选,默认就是 GET)
.build();
try (Response response = client.newCall(request).execute()) {
// 3. 执行请求并获取响应
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
// 4. 获取响应体
String responseBody = response.body().string();
System.out.println("Response Body: " + responseBody);
} catch (IOException e) {
e.printStackTrace();
}
}
}
POST 请求示例
发送 JSON 数据

import okhttp3.*;
import java.io.IOException;
public class OkHttpPostExample {
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
// 1. 创建请求体
MediaType JSON = MediaType.get("application/json; charset=utf-8");
String jsonBody = "{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}";
RequestBody body = RequestBody.create(jsonBody, JSON);
// 2. 创建请求
Request request = new Request.Builder()
.url("https://jsonplaceholder.typicode.com/posts")
.post(body)
.build();
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 Body: " + responseBody);
} catch (IOException e) {
e.printStackTrace();
}
}
}
发送文件
// ... (OkHttpClient client = new OkHttpClient();)
// 1. 创建文件请求体
File file = new File("path/to/your/file.txt");
RequestBody fileBody = RequestBody.create(file, MediaType.parse("text/plain"));
// 2. 创建 Multipart 请求体
MultipartBody multipartBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", "file.txt", fileBody)
.addFormDataPart("description", "This is a test file")
.build();
// 3. 创建请求
Request request = new Request.Builder()
.url("https://your-upload-endpoint.com/upload")
.post(multipartBody)
.build();
// ... (执行请求)
优缺点
- 优点:
- API 非常简洁、易读。
- 功能强大:支持异步、同步、WebSocket、拦截器等。
- 性能优异,内置连接池和缓存。
- 社区活跃,文档完善。
- 缺点:
需要引入第三方依赖。
经典强大:Apache HttpClient
Apache HttpClient 是一个历史悠久、功能极其全面的 HTTP 组件库,它提供了对 HTTP 协议最底层的精细控制。
简介
一个成熟、稳定、功能极其丰富的 HTTP 客户端库,适合需要处理复杂 HTTP 场景的企业级应用。
添加依赖 (Maven)
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
<version>5.3.1</version> <!-- 请使用最新版本 -->
</dependency>
<!-- 如果需要处理 JSON,可以添加 -->
<dependency>
<groupId>org.apache.httpcomponents.core5</groupId>
<artifactId>httpcore5</artifactId>
<version>5.2</version>
</dependency>
GET 请求示例
import org.apache.hc.client5.http.classic.methods.HttpGet;
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.HttpEntity;
import org.apache.hc.core5.http.io.entity.EntityUtils;
public class ApacheHttpClientGetExample {
public static void main(String[] args) {
// 1. 创建 HttpClient 实例
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
// 2. 创建 HTTP GET 请求
HttpGet request = new HttpGet("https://jsonplaceholder.typicode.com/posts/1");
// 3. 执行请求
try (CloseableHttpResponse response = httpClient.execute(request)) {
// 4. 获取响应实体
HttpEntity entity = response.getEntity();
if (entity != null) {
// 将响应实体转换为字符串
String result = EntityUtils.toString(entity);
System.out.println("Response Body: " + result);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
POST 请求示例
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.HttpEntity;
import org.apache.hc.core5.http.io.entity.EntityUtils;
public class ApacheHttpClientPostExample {
public static void main(String[] args) {
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
// 1. 创建 HTTP POST 请求
HttpPost post = new HttpPost("https://jsonplaceholder.typicode.com/posts");
// 2. 创建 JSON 请求体
String json = "{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}";
StringEntity entity = new StringEntity(json);
post.setEntity(entity);
post.setHeader("Content-type", "application/json");
// 3. 执行请求
try (CloseableHttpResponse response = httpClient.execute(post)) {
HttpEntity responseEntity = response.getEntity();
if (responseEntity != null) {
String result = EntityUtils.toString(responseEntity);
System.out.println("Response Body: " + result);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
优缺点
- 优点:
- 功能最全面,对 HTTP 协议的支持最细致。
- 非常稳定,适合企业级应用。
- 配置灵活,高度可定制。
- 缺点:
- API 相对
OkHttp来说更冗长、复杂。 - 需要引入依赖。
- 相比
OkHttp,配置和使用上略显繁琐。
- API 相对
总结与对比
| 特性/库 | HttpURLConnection |
OkHttp |
Apache HttpClient |
|---|---|---|---|
| 依赖 | 无 (JDK 内置) | 需要 | 需要 |
| API 简洁性 | 繁琐 | 非常简洁 | 较为冗长 |
| 功能 | 基础 | 强大 (异步、连接池等) | 最全面 |
| 性能 | 一般 | 优异 | 优异 |
| 易用性 | 低 | 高 | 中等 |
| 适用场景 | 简单脚本、不想引入依赖的项目 | 绝大多数 Java 项目,特别是现代应用 | 企业级应用、需要精细控制 HTTP 协议的场景 |
| 推荐指数 | ⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
最终建议
- 对于新项目或绝大多数 Java 应用:强烈推荐使用
OkHttp,它在易用性、性能和功能之间取得了完美的平衡,是目前社区的事实标准。 - 对于快速原型或简单的工具脚本:如果不想引入任何外部库,
HttpURLConnection是一个可行的选择,但要做好处理繁琐 API 的准备。 - 对于有特殊需求的企业级项目:如果项目已经使用了
Apache HttpClient,或者你需要利用其对 HTTP 协议最底层的精细控制(如复杂的认证、自定义协议等),Apache HttpClient是一个可靠的选择。
