Java HttpURLConnection
外观
Java HttpURLConnection[编辑 | 编辑源代码]
HttpURLConnection 是 Java 标准库(`java.net` 包)提供的一个类,用于发送 HTTP 请求并处理 HTTP 响应。它是基于 URLConnection 的抽象类,专门用于 HTTP/HTTPS 协议。HttpURLConnection 提供了一种简单的方式来与 Web 服务器进行交互,支持 GET、POST、PUT、DELETE 等 HTTP 方法,并可以处理请求头、响应头和状态码。
基本介绍[编辑 | 编辑源代码]
HttpURLConnection 是一个轻量级的 HTTP 客户端,适用于简单的 HTTP 请求场景。它不需要额外的依赖库(如 Apache HttpClient 或 OkHttp),因此在小型项目或需要原生 Java 支持的场景下非常有用。
主要特点[编辑 | 编辑源代码]
- 支持 HTTP 和 HTTPS 协议。
- 可以设置请求方法(GET、POST、PUT、DELETE 等)。
- 允许自定义请求头(Headers)。
- 可以读取和写入请求体(Request Body)。
- 提供响应状态码、响应头和响应体的访问。
基本用法[编辑 | 编辑源代码]
以下是一个简单的示例,展示如何使用 HttpURLConnection 发送一个 GET 请求并读取响应:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpURLConnectionExample {
public static void main(String[] args) throws Exception {
// 1. 创建 URL 对象
URL url = new URL("https://jsonplaceholder.typicode.com/posts/1");
// 2. 打开 HTTP 连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 3. 设置请求方法(默认为 GET)
connection.setRequestMethod("GET");
// 4. 获取响应码
int responseCode = connection.getResponseCode();
System.out.println("Response Code: " + responseCode);
// 5. 读取响应内容
if (responseCode == HttpURLConnection.HTTP_OK) { // HTTP 200
BufferedReader reader = new BufferedReader(
new InputStreamReader(connection.getInputStream())
);
String line;
StringBuilder response = new StringBuilder();
while ((line = reader.readLine()) != null) {
response.append(line);
}
reader.close();
System.out.println("Response Body: " + response.toString());
} else {
System.out.println("Request failed with status: " + responseCode);
}
// 6. 关闭连接
connection.disconnect();
}
}
输出示例[编辑 | 编辑源代码]
Response Code: 200 Response Body: { "userId": 1, "id": 1, "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto" }
进阶用法[编辑 | 编辑源代码]
发送 POST 请求[编辑 | 编辑源代码]
HttpURLConnection 也可以用于发送 POST 请求,并附带请求体(如 JSON 数据)。以下是一个示例:
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpPostExample {
public static void main(String[] args) throws Exception {
URL url = new URL("https://jsonplaceholder.typicode.com/posts");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 设置请求方法为 POST
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/json");
connection.setDoOutput(true); // 允许写入请求体
// 构造 JSON 请求体
String jsonInput = "{\"title\": \"foo\", \"body\": \"bar\", \"userId\": 1}";
// 写入请求体
try (OutputStream os = connection.getOutputStream()) {
byte[] input = jsonInput.getBytes("utf-8");
os.write(input, 0, input.length);
}
// 读取响应
int responseCode = connection.getResponseCode();
System.out.println("Response Code: " + responseCode);
if (responseCode == HttpURLConnection.HTTP_CREATED) { // HTTP 201
// 读取响应内容(类似 GET 示例)
// ...
}
connection.disconnect();
}
}
设置请求头[编辑 | 编辑源代码]
可以通过 `setRequestProperty` 方法设置自定义请求头:
connection.setRequestProperty("User-Agent", "MyJavaApp/1.0");
connection.setRequestProperty("Authorization", "Bearer token123");
处理重定向[编辑 | 编辑源代码]
HttpURLConnection 默认会自动处理 HTTP 重定向(3xx 状态码)。如果需要禁用重定向,可以设置:
connection.setInstanceFollowRedirects(false);
超时设置[编辑 | 编辑源代码]
可以设置连接超时和读取超时(单位:毫秒):
connection.setConnectTimeout(5000); // 5 秒连接超时
connection.setReadTimeout(10000); // 10 秒读取超时
实际应用场景[编辑 | 编辑源代码]
HttpURLConnection 适用于以下场景:
- 调用 REST API 获取或提交数据。
- 爬取网页内容(需遵守 robots.txt 规则)。
- 与微服务或其他 HTTP 服务交互。
- 在 Android 应用中进行网络请求(注意:Android 推荐使用更现代的库如 OkHttp)。
注意事项[编辑 | 编辑源代码]
- **线程安全**:HttpURLConnection 不是线程安全的,每个请求应使用独立的实例。
- **异常处理**:网络请求可能抛出 `IOException`,应妥善处理。
- **性能**:对于高频请求,建议使用连接池(如 Apache HttpClient)。
- **HTTPS**:默认支持 HTTPS,但可能需要配置信任证书(如自签名证书)。
总结[编辑 | 编辑源代码]
HttpURLConnection 是 Java 标准库提供的 HTTP 客户端工具,适用于简单的 HTTP 请求。虽然功能不如第三方库(如 Apache HttpClient 或 OkHttp)强大,但在不需要复杂功能的情况下,它是一个轻量级的选择。