一、简介
在现代的软件开发中,与外部服务进行 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¶m2=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 - Agent
和 Accept
,以模拟浏览器请求或指定接收的数据类型。
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());
}
}
}
通过 setConnectionTimeout
和 setReadTimeout
方法可以分别设置连接超时时间和读取超时时间,避免长时间等待无响应的请求。
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 通信,提高开发效率,专注于业务逻辑的实现。