Hutool - Http:基于 HttpUrlConnection 的 Http 客户端封装

发布于:2025-02-24 ⋅ 阅读:(19) ⋅ 点赞:(0)
一、简介

在现代的软件开发中,与外部服务进行 HTTP 通信是非常常见的需求,比如调用第三方 API、获取网页内容等。Java 标准库中的 HttpUrlConnection 提供了基本的 HTTP 请求功能,但使用起来较为繁琐,需要处理很多细节,如连接管理、请求头设置、响应处理等。Hutool - Http 模块对 HttpUrlConnection 进行了封装,提供了简洁易用的 API,使得开发者可以更方便地进行 HTTP 请求,无需关注底层的复杂实现。

二、引入依赖

如果你使用 Maven 项目,在 pom.xml 中添加以下依赖:

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.16</version>
</dependency>

若使用 Gradle 项目,在 build.gradle 中添加:

implementation 'cn.hutool:hutool-all:5.8.16'
三、基本的 HTTP 请求
1. GET 请求
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;

public class GetRequestExample {
    public static void main(String[] args) {
        // 发送 GET 请求
        HttpResponse response = HttpRequest.get("https://www.example.com")
               .execute();

        // 检查响应状态码
        if (response.isOk()) {
            // 获取响应体
            String body = response.body();
            System.out.println("响应内容:" + body);
        } else {
            System.out.println("请求失败,状态码:" + response.getStatus());
        }
    }
}

在上述代码中,使用 HttpRequest.get 方法创建一个 GET 请求对象,指定请求的 URL。调用 execute 方法发送请求并获取响应对象 HttpResponse。通过 isOk 方法检查响应状态码是否为 200(表示请求成功),如果成功则使用 body 方法获取响应体内容并输出。

2. POST 请求
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;

public class PostRequestExample {
    public static void main(String[] args) {
        // 要发送的数据
        String data = "param1=value1&param2=value2";

        // 发送 POST 请求
        HttpResponse response = HttpRequest.post("https://www.example.com")
               .body(data)
               .execute();

        // 检查响应状态码
        if (response.isOk()) {
            // 获取响应体
            String body = response.body();
            System.out.println("响应内容:" + body);
        } else {
            System.out.println("请求失败,状态码:" + response.getStatus());
        }
    }
}

对于 POST 请求,使用 HttpRequest.post 方法创建请求对象,通过 body 方法设置请求体数据,然后调用 execute 方法发送请求并处理响应。

四、设置请求头和参数
1. 设置请求头
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;

public class SetHeadersExample {
    public static void main(String[] args) {
        // 发送 GET 请求并设置请求头
        HttpResponse response = HttpRequest.get("https://www.example.com")
               .header("User-Agent", "Mozilla/5.0")
               .header("Accept", "application/json")
               .execute();

        if (response.isOk()) {
            String body = response.body();
            System.out.println("响应内容:" + body);
        } else {
            System.out.println("请求失败,状态码:" + response.getStatus());
        }
    }
}

在这个示例中,使用 header 方法为请求设置多个请求头,如 User - AgentAccept,以模拟浏览器请求或指定接收的数据类型。

2. 设置请求参数
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import java.util.HashMap;
import java.util.Map;

public class SetParamsExample {
    public static void main(String[] args) {
        // 定义请求参数
        Map<String, Object> params = new HashMap<>();
        params.put("param1", "value1");
        params.put("param2", "value2");

        // 发送 GET 请求并设置请求参数
        HttpResponse response = HttpRequest.get("https://www.example.com")
               .form(params)
               .execute();

        if (response.isOk()) {
            String body = response.body();
            System.out.println("响应内容:" + body);
        } else {
            System.out.println("请求失败,状态码:" + response.getStatus());
        }
    }
}

使用 form 方法可以为请求设置参数,参数以 Map 的形式传入,Hutool 会自动将参数拼接在 URL 后面(GET 请求)或放在请求体中(POST 请求)。

五、处理响应
1. 获取响应状态码和响应头
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import java.util.Map;

public class ResponseHandlingExample {
    public static void main(String[] args) {
        HttpResponse response = HttpRequest.get("https://www.example.com")
               .execute();

        // 获取响应状态码
        int statusCode = response.getStatus();
        System.out.println("响应状态码:" + statusCode);

        // 获取响应头
        Map<String, List<String>> headers = response.headers();
        for (Map.Entry<String, List<String>> entry : headers.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

通过 getStatus 方法可以获取响应的状态码,使用 headers 方法可以获取响应的所有头信息。

2. 下载文件
import cn.hutool.http.HttpRequest;
import java.io.File;

public class FileDownloadExample {
    public static void main(String[] args) {
        // 下载文件
        HttpRequest.get("https://example.com/file.zip")
               .execute()
               .writeBody(new File("downloaded_file.zip"));
        System.out.println("文件下载完成");
    }
}

使用 writeBody 方法可以将响应体内容写入到指定的文件中,实现文件下载功能。

六、超时设置和代理配置
1. 超时设置
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;

public class TimeoutExample {
    public static void main(String[] args) {
        // 设置连接超时和读取超时时间(单位:毫秒)
        HttpResponse response = HttpRequest.get("https://www.example.com")
               .setConnectionTimeout(5000)
               .setReadTimeout(5000)
               .execute();

        if (response.isOk()) {
            String body = response.body();
            System.out.println("响应内容:" + body);
        } else {
            System.out.println("请求失败,状态码:" + response.getStatus());
        }
    }
}

通过 setConnectionTimeoutsetReadTimeout 方法可以分别设置连接超时时间和读取超时时间,避免长时间等待无响应的请求。

2. 代理配置
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;

public class ProxyExample {
    public static void main(String[] args) {
        // 设置代理
        HttpResponse response = HttpRequest.get("https://www.example.com")
               .setProxy("proxy.example.com", 8080)
               .execute();

        if (response.isOk()) {
            String body = response.body();
            System.out.println("响应内容:" + body);
        } else {
            System.out.println("请求失败,状态码:" + response.getStatus());
        }
    }
}

使用 setProxy 方法可以为请求配置代理服务器,指定代理服务器的主机名和端口。

七、注意事项
  • 异常处理:在实际开发中,HTTP 请求可能会因为网络问题、服务器故障等原因失败,需要对可能出现的异常进行处理,如 IOException 等。
  • 编码问题:在处理响应体时,要注意字符编码问题,确保正确解析响应内容。Hutool 会自动处理常见的编码,但在某些特殊情况下可能需要手动指定编码。
  • 资源管理:虽然 Hutool 会自动关闭连接等资源,但在处理大量请求时,仍要注意资源的合理使用,避免出现资源耗尽的情况。

通过使用 Hutool - Http,开发者可以更轻松地进行 HTTP 通信,提高开发效率,专注于业务逻辑的实现。