Apache HttpClient框架常用组件介绍
1、简介
HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient。
HttpClient 相比传统 JDK 自带的 URLConnection
,增加了易用性和灵活性,它不仅是客户端发送 HTTP 请求变得容易,而且也方便了开发人员测试接口(基于 HTTP 协议的),即提高了开发的效率,也方便提高代码的健壮性。因此熟练掌握 HttpClient 是很重要的必修内容,掌握 HttpClient 后,相信对于 HTTP 协议的了解会更加深入。
2、引入依赖
HttpClient 是三方工具,首先需要引入依赖。如下:
<!-- 此处使用的是 5.x 版本,可以根据自身情况引入版本 -->
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
<version>5.1.1</version>
</dependency>
3、常用组件
- HttpClientBuilder:
- 用于创建和配置
HttpClient
实例的工厂类。 - 允许用户设置各种参数,如连接管理器、连接超时、重试策略等。
- 用于创建和配置
- HttpClient:
- HTTP客户端的核心接口。
- 负责执行HTTP请求并返回HTTP响应。
- 内部使用连接管理器(如
PoolingHttpClientConnectionManager
)来管理HTTP连接。
- CloseableHttpClient:
HttpClient
的一个具体实现,它实现了AutoCloseable
接口。- 提供了额外的关闭连接的方法,以确保资源得到正确释放。
- HttpRequest:
- 表示HTTP请求。
- 包含请求行、请求头和请求体。
- HttpResponse:
- 表示HTTP响应。
- 包含状态行、响应头和响应体。
- HttpGet 和 HttpPost:
HttpRequest
的具体实现,分别对应HTTP的GET和POST方法。
- HttpClientConnectionManager:
- 负责管理HTTP连接。
- 提供了获取连接、释放连接等方法。
- PoolingHttpClientConnectionManager:
HttpClientConnectionManager
的一个具体实现。- 提供了连接池功能,以复用HTTP连接。
- HttpClientConnectionOperator:
- 负责创建和管理底层的HTTP连接(如
ManagedHttpClientConnection
)。
- 负责创建和管理底层的HTTP连接(如
- ManagedHttpClientConnection:
- 表示底层的HTTP连接。
- 封装了与远程服务器的通信过程。
- HttpHost:
- 表示目标服务器的地址信息。
- 包含主机名、端口号和协议类型。
- InetSocketAddress:
- Java标准库中的类,用于表示IP地址和端口号的组合。
- 在HttpClient中用于将
HttpHost
转换为具体的网络地址。
- SocketConfig:
- 定义了套接字连接的相关配置。
- 如超时时间、TCP参数等。
- HttpContext:
- 提供在HTTP请求执行期间传递上下文信息的机制。
- 允许用户在请求之间共享状态信息。
- DnsResolver:
- 负责将主机名解析为IP地址。
4、设计原则
- 模块化与解耦:将HTTP客户端的不同功能划分为独立的组件和类,使得代码更加清晰、易于维护和扩展。每个组件和类都有明确的职责,并且它们之间的依赖关系相对简单,便于测试和替换。
- 灵活性:通过HttpClientBuilder,用户可以轻松地配置HttpClient的各种参数,以适应不同的使用场景和需求。这种灵活性使得HttpClient库能够适用于各种复杂的HTTP通信场景。
- 性能优化:通过引入连接池(如PoolingHttpClientConnectionManager),HttpClient库能够复用HTTP连接,减少了建立和关闭连接的开销,从而提高了性能。此外,底层的ManagedHttpClientConnection和SocketConfig也提供了对底层网络通信的精细控制,进一步优化了性能。
- 可扩展性:HttpClient库的设计允许用户自定义和扩展组件。例如,用户可以实现自己的DnsResolver或HttpClientConnectionOperator来提供自定义的DNS解析或连接管理策略。这种可扩展性使得HttpClient库能够适应不断变化的需求和技术发展。
5、组件交互过程
- 使用HttpClientBuilder构建HttpClient:
- 用户通过HttpClientBuilder配置HttpClient的各种参数,如连接池、超时设置等。
- 构建完成后,用户获取到一个配置好的HttpClient实例。
- 创建HttpRequest:
- 用户根据需要创建具体的HttpRequest实例,如HttpGet或HttpPost。
- 每个HttpRequest实例都关联一个HttpHost,指明了请求的目标服务器。
- 执行请求并获取HttpResponse:
- 用户调用HttpClient的execute方法,并传入HttpRequest实例。
- HttpClient使用底层的HttpClientConnectionOperator和ManagedHttpClientConnection来建立和管理与远程服务器的连接。
- 如果需要解析主机名,HttpClient会调用DnsResolver来解析HttpHost中的主机名。
- HttpClient通过底层的连接发送HttpRequest,并等待服务器的响应。
- 一旦收到响应,HttpClient将其封装为HttpResponse对象,并返回给用户。
- 处理响应和释放连接:
- 用户从HttpResponse中获取响应数据,并进行相应的处理。
- 请求执行完毕后,HttpClient会负责释放底层的ManagedHttpClientConnection,以便后续请求可以复用。
综合示例
下面是一个使用这些组件的综合示例:
代码语言:javascript代码运行次数:0运行复制import org.apache.http.HttpHost;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.util.EntityUtils;
public class HttpClientExample {
public static void main(String[] args) throws Exception {
// 创建连接池管理器
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();
// 设置最大连接数等参数(这里仅为示例)
connManager.setMaxTotal(100);
connManager.setDefaultMaxPerRoute(20);
// 创建 HttpClientBuilder 并设置连接池管理器
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(connManager)
.build();
// 创建 HttpGet 请求
HttpGet httpGet = new HttpGet(";);
// 设置请求配置(可选)
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(5000)
.setSocketTimeout(5000)
.build();
httpGet.setConfig(requestConfig);
try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
// 检查响应状态码
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("Status Code: " + statusCode);
// 获取响应内容并输出
String responseBody = EntityUtils.toString(response.getEntity(), "UTF-8");
System.out.println("Response: " + responseBody);
}
// 关闭 HttpClient(如果是 CloseableHttpClient)
httpClient.close();
}
}
在这个示例中:
- 使用
PoolingHttpClientConnectionManager
创建了一个连接池管理器,并设置了最大连接数等参数。 - 使用
HttpClients.custom()
创建了一个HttpClientBuilder
,并通过setConnectionManager
方法设置了连接池管理器。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1747917357a4704902.html
评论列表(0条)