跳转到内容

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)强大,但在不需要复杂功能的情况下,它是一个轻量级的选择。

流程图示例[编辑 | 编辑源代码]

graph TD A[创建 URL 对象] --> B[打开 HttpURLConnection] B --> C[设置请求方法] C --> D[设置请求头] D --> E[写入请求体(POST/PUT)] E --> F[发送请求] F --> G[获取响应码] G --> H{成功?} H -->|是| I[读取响应体] H -->|否| J[处理错误] I --> K[关闭连接] J --> K

参见[编辑 | 编辑源代码]