在 Java 中发送 HTTP GET 请求,有几种常见的方式,从传统的 HttpURLConnection 到现代的第三方库如 Apache HttpClient 和 OkHttp,下面我将分别介绍这几种方法,并提供完整的代码示例。

使用 java.net.HttpURLConnection (JDK 内置,无需额外依赖)
这是最基础、最直接的方法,不需要引入任何第三方库,从 Java 1.1 开始就存在,但它的 API 相对繁琐。
代码示例
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpURLConnectionExample {
public static void main(String[] args) {
String urlString = "https://jsonplaceholder.typicode.com/posts/1";
try {
// 1. 创建一个 URL 对象
URL url = new URL(urlString);
// 2. 打开一个 HttpURLConnection 连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 3. 设置请求方法为 GET
connection.setRequestMethod("GET");
// 4. 设置请求头 (可选)
// connection.setRequestProperty("User-Agent", "Mozilla/5.0");
// connection.setRequestProperty("Accept", "application/json");
// 5. 获取响应码
int responseCode = connection.getResponseCode();
System.out.println("Response Code: " + responseCode);
// 6. 如果响应码是 200 (OK),则读取响应数据
if (responseCode == HttpURLConnection.HTTP_OK) {
// 使用 try-with-resources 自动关闭流
try (BufferedReader in = new BufferedReader(
new InputStreamReader(connection.getInputStream()))) {
String inputLine;
StringBuilder response = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
// 7. 打印响应内容
System.out.println("Response Body: " + response.toString());
}
} else {
System.out.println("GET request failed");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
优缺点
- 优点: 无需依赖任何外部库,是 Java 标准库的一部分。
- 缺点:
- API 较为繁琐,需要手动管理连接和流。
- 处理连接超时、读取超时等需要额外设置。
- 对于复杂的 HTTP 请求(如异步、文件上传等)支持不佳。
使用 Apache HttpClient (功能强大,工业级标准)
Apache HttpClient 是一个功能非常全面的 HTTP 客户端库,被广泛应用于企业级应用中,它提供了更简洁、更强大的 API。
步骤
- 添加依赖 (如果你使用 Maven):
<dependency> <groupId>org.apache.httpcomponents.client5</groupId> <artifactId>httpclient5</artifactId> <version>5.3.1</version> <!-- 请使用最新版本 --> </dependency>如果你使用 Gradle:
implementation 'org.apache.httpcomponents.client5:httpclient5:5.3.1'
代码示例
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.io.entity.EntityUtils;
import org.apache.hc.core5.http.ParseException;
public class ApacheHttpClientExample {
public static void main(String[] args) {
String apiUrl = "https://jsonplaceholder.typicode.com/posts/1";
// 1. 创建一个 HttpClient 实例
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
// 2. 创建一个 HttpGet 请求对象
HttpGet request = new HttpGet(apiUrl);
// 3. 可选:设置请求头
// request.setHeader("Accept", "application/json");
// 4. 执行请求,并获取响应
try (CloseableHttpResponse response = httpClient.execute(request)) {
// 5. 获取响应状态码
System.out.println("Response Code: " + response.getCode());
// 6. 获取响应实体并转换为字符串
if (response.getEntity() != null) {
String responseBody = EntityUtils.toString(response.getEntity());
System.out.println("Response Body: " + responseBody);
}
} catch (ParseException | IOException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
优缺点
- 优点:
- API 相对简洁,易于使用。
- 功能非常强大,支持连接池、重试、Cookie、认证等高级特性。
- 性能和稳定性都很好,是业界广泛使用的标准。
- 缺点: 需要引入额外的第三方库。
使用 OkHttp (现代、高效,常用于 Android)
OkHttp 是一个由 Square 公司(现已独立)开发的开源项目,以其高效的连接池和简洁的 API 而闻名,是 Android 开发中首选的 HTTP 客户端。

步骤
- 添加依赖 (如果你使用 Maven):
<dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.12.0</version> <!-- 请使用最新版本 --> </dependency>如果你使用 Gradle:
implementation 'com.squareup.okhttp3:okhttp:4.12.0'
代码示例
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class OkHttpExample {
public static void main(String[] args) {
String url = "https://jsonplaceholder.typicode.com/posts/1";
// 1. 创建一个 OkHttpClient 实例 (通常单例使用)
OkHttpClient client = new OkHttpClient();
// 2. 创建一个 Request 对象
Request request = new Request.Builder()
.url(url)
// 可选:添加请求头
// .header("User-Agent", "OkHttp Example")
.build();
// 3. 执行请求 (使用 try-with-resources 自动关闭响应体)
try (Response response = client.newCall(request).execute()) {
// 4. 判断响应是否成功 (isSuccessful() 会检查 2xx 状态码)
if (response.isSuccessful()) {
// 5. 获取响应体内容
String responseBody = response.body().string();
System.out.println("Response Code: " + response.code());
System.out.println("Response Body: " + responseBody);
} else {
System.out.println("Request failed: " + response.code());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
优缺点
- 优点:
- API 极其简洁,易于上手。
- 内置连接池,性能优异。
- 对同步和异步请求都支持得很好。
- 内置对 GZIP 的支持。
- 缺点: 需要引入额外的第三方库。
总结与选择建议
| 特性 | HttpURLConnection |
Apache HttpClient |
OkHttp |
|---|---|---|---|
| 依赖 | 无需 | 需要 | 需要 |
| 易用性 | 较差 | 中等 | 极佳 |
| 功能 | 基础 | 非常强大 | 强大 |
| 性能 | 一般 | 好 | 优秀 |
| 适用场景 | 简单脚本、快速原型、无法引入第三方库的环境 | 企业级 Java 应用、需要复杂 HTTP 功能的服务端 | Android 应用、现代 Java 服务端、对性能和易用性要求高的场景 |
如何选择?
- 如果你只是想写一个非常简单的脚本,或者项目不允许引入任何外部库,那么使用
HttpURLConnection是可行的。 - 如果你正在构建一个复杂的企业级后端应用,需要处理连接池、认证、重试等,
Apache HttpClient是一个非常成熟和可靠的选择。 - 如果你正在开发一个现代应用,尤其是 Android 应用,或者你追求最简洁的 API 和最好的性能,
OkHttp是目前的首选,它极大地简化了网络请求的代码。

