Apache HttpComponents HttpClient
Apache HttpComponents HttpClient
是 Apache 提供的一个开源库,用于在 Java 应用程序中执行 HTTP 请求和响应处理。它支持同步和异步模式,提供了对常见 HTTP 操作的简单而强大的封装。
1.HTTP 请求
实体
实体可以理解为 HTTP 请求或响应的“数据负载”。它可以包含:
- 字符串数据(如 JSON、XML)
- 文件数据(如图片、PDF)
-
表单数据(如
x-www-form-urlencoded
或multipart/form-data
)
通过 Entity
类封装的请求体或响应体可以承载任何格式的数据,传递给服务器或从服务器接收。
请求数据格式:
-
application/x-www-form-urlencoded
:-
格式:键值对形式,
key=value
,多个键值对之间用&
连接。 -
编码:特殊字符和空格使用 URL 编码(如空格为
+
,&
编码为%26
)。 - 应用:传统 Web 表单提交的默认格式,常用于简单数据的传输。
-
示例:
name=John+Doe&age=25&city=New+York
-
格式:键值对形式,
-
application/json
:-
格式:JSON 格式,表示复杂的对象结构,用
{}
表示对象,键值对用:
连接。 - 编码:不需要 URL 编码,数据直接作为 JSON 字符串传输。
- 应用:现代 RESTful API 常用的数据格式,适合复杂对象和嵌套结构。
-
{ "name": "John Doe", "age": 25, "city": "New York" }
-
格式:JSON 格式,表示复杂的对象结构,用
超时配置:
-
连接超时 (
setConnectTimeout
):设定客户端与服务器建立连接的最大等待时间。 -
请求超时 (
setConnectionRequestTimeout
):从连接池获取连接的最大等待时间。 -
读取超时 (
setSocketTimeout
):等待服务器返回数据的最大时间。
private static RequestConfig builderRequestConfig() {
return RequestConfig.custom()
.setConnectTimeout(TIMEOUT_MSEC) // 连接超时
.setConnectionRequestTimeout(TIMEOUT_MSEC) // 请求超时
.setSocketTimeout(TIMEOUT_MSEC) // 读取超时
.build(); // 构建配置
}
2. 主要功能
- HTTP 请求的发送:支持 GET、POST、PUT、DELETE 等各种 HTTP 请求方法。
- 连接管理:包括持久连接、连接池和请求重试等机制,确保高效和可靠的 HTTP 连接管理。
- 超时控制:支持连接超时、请求超时、套接字超时的配置。
- SSL 支持:内置对 HTTPS(SSL/TLS)的支持,能够通过证书进行安全通信。
- 重定向与代理支持:自动处理 HTTP 重定向以及通过代理服务器发送请求。
3.示例网络请求
import org.apache.http.client.methods.*;
import org.apache.http.impl.client.*;
import org.apache.http.util.EntityUtils;
import org.apache.http.entity.StringEntity;
public class HttpClientExample {
public static void main(String[] args) throws Exception {
// 创建HttpClient
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
// GET请求
HttpGet getRequest = new HttpGet("http://www.example.com");
try (CloseableHttpResponse response = httpClient.execute(getRequest)) {
String getResult = EntityUtils.toString(response.getEntity());
System.out.println("GET响应: " + getResult);
}
// POST请求
HttpPost postRequest = new HttpPost("http://www.example.com/post");
postRequest.setEntity(new StringEntity("{\"key\":\"value\"}", "UTF-8"));
postRequest.setHeader("Content-Type", "application/json");
try (CloseableHttpResponse response = httpClient.execute(postRequest)) {
String postResult = EntityUtils.toString(response.getEntity());
System.out.println("POST响应: " + postResult);
}
}
}
}
-
GET 请求:
- 需要将返回的实体通过
EntityUtils.toString()
转为字符串,以方便处理响应内容。
- 需要将返回的实体通过
-
POST 请求:
- 使用
setHeader()
设置请求头信息,例如Content-Type
为application/json
,并指定编码方式。 - 需要使用
StringEntity
封装请求数据为一个实体对象,方便发送带有请求体的数据。
- 使用