admin管理员组

文章数量:1032176

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 版本,可以根据自身情况引入版本 -->

代码语言:javascript代码运行次数:0运行复制
<dependency>
     <groupId>org.apache.httpcomponents.client5</groupId>
     <artifactId>httpclient5</artifactId>
     <version>5.1.1</version>
</dependency>

3、常用组件

  1. HttpClientBuilder:
    • 用于创建和配置HttpClient实例的工厂类。
    • 允许用户设置各种参数,如连接管理器、连接超时、重试策略等。
  2. HttpClient:
    • HTTP客户端的核心接口。
    • 负责执行HTTP请求并返回HTTP响应。
    • 内部使用连接管理器(如PoolingHttpClientConnectionManager)来管理HTTP连接。
  3. CloseableHttpClient:
    • HttpClient的一个具体实现,它实现了AutoCloseable接口。
    • 提供了额外的关闭连接的方法,以确保资源得到正确释放。
  4. HttpRequest:
    • 表示HTTP请求。
    • 包含请求行、请求头和请求体。
  5. HttpResponse:
    • 表示HTTP响应。
    • 包含状态行、响应头和响应体。
  6. HttpGet 和 HttpPost:
    • HttpRequest的具体实现,分别对应HTTP的GET和POST方法。
  7. HttpClientConnectionManager:
    • 负责管理HTTP连接。
    • 提供了获取连接、释放连接等方法。
  8. PoolingHttpClientConnectionManager:
    • HttpClientConnectionManager的一个具体实现。
    • 提供了连接池功能,以复用HTTP连接。
  9. HttpClientConnectionOperator:
    • 负责创建和管理底层的HTTP连接(如ManagedHttpClientConnection)。
  10. ManagedHttpClientConnection:
    • 表示底层的HTTP连接。
    • 封装了与远程服务器的通信过程。
  11. HttpHost:
    • 表示目标服务器的地址信息。
    • 包含主机名、端口号和协议类型。
  12. InetSocketAddress:
    • Java标准库中的类,用于表示IP地址和端口号的组合。
    • 在HttpClient中用于将HttpHost转换为具体的网络地址。
  13. SocketConfig:
    • 定义了套接字连接的相关配置。
    • 如超时时间、TCP参数等。
  14. HttpContext:
    • 提供在HTTP请求执行期间传递上下文信息的机制。
    • 允许用户在请求之间共享状态信息。
  15. DnsResolver:
    • 负责将主机名解析为IP地址。

4、设计原则

  1. 模块化与解耦:将HTTP客户端的不同功能划分为独立的组件和类,使得代码更加清晰、易于维护和扩展。每个组件和类都有明确的职责,并且它们之间的依赖关系相对简单,便于测试和替换。
  2. 灵活性:通过HttpClientBuilder,用户可以轻松地配置HttpClient的各种参数,以适应不同的使用场景和需求。这种灵活性使得HttpClient库能够适用于各种复杂的HTTP通信场景。
  3. 性能优化:通过引入连接池(如PoolingHttpClientConnectionManager),HttpClient库能够复用HTTP连接,减少了建立和关闭连接的开销,从而提高了性能。此外,底层的ManagedHttpClientConnection和SocketConfig也提供了对底层网络通信的精细控制,进一步优化了性能。
  4. 可扩展性:HttpClient库的设计允许用户自定义和扩展组件。例如,用户可以实现自己的DnsResolver或HttpClientConnectionOperator来提供自定义的DNS解析或连接管理策略。这种可扩展性使得HttpClient库能够适应不断变化的需求和技术发展。

5、组件交互过程

  1. 使用HttpClientBuilder构建HttpClient:
    • 用户通过HttpClientBuilder配置HttpClient的各种参数,如连接池、超时设置等。
    • 构建完成后,用户获取到一个配置好的HttpClient实例。
  2. 创建HttpRequest:
    • 用户根据需要创建具体的HttpRequest实例,如HttpGet或HttpPost。
    • 每个HttpRequest实例都关联一个HttpHost,指明了请求的目标服务器。
  3. 执行请求并获取HttpResponse:
    • 用户调用HttpClient的execute方法,并传入HttpRequest实例。
    • HttpClient使用底层的HttpClientConnectionOperator和ManagedHttpClientConnection来建立和管理与远程服务器的连接。
    • 如果需要解析主机名,HttpClient会调用DnsResolver来解析HttpHost中的主机名。
    • HttpClient通过底层的连接发送HttpRequest,并等待服务器的响应。
    • 一旦收到响应,HttpClient将其封装为HttpResponse对象,并返回给用户。
  4. 处理响应和释放连接:
    • 用户从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 方法设置了连接池管理器。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2024-04-25,如有侵权请联系 cloudcommunity@tencent 删除框架连接配置apachehttpclient

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 版本,可以根据自身情况引入版本 -->

代码语言:javascript代码运行次数:0运行复制
<dependency>
     <groupId>org.apache.httpcomponents.client5</groupId>
     <artifactId>httpclient5</artifactId>
     <version>5.1.1</version>
</dependency>

3、常用组件

  1. HttpClientBuilder:
    • 用于创建和配置HttpClient实例的工厂类。
    • 允许用户设置各种参数,如连接管理器、连接超时、重试策略等。
  2. HttpClient:
    • HTTP客户端的核心接口。
    • 负责执行HTTP请求并返回HTTP响应。
    • 内部使用连接管理器(如PoolingHttpClientConnectionManager)来管理HTTP连接。
  3. CloseableHttpClient:
    • HttpClient的一个具体实现,它实现了AutoCloseable接口。
    • 提供了额外的关闭连接的方法,以确保资源得到正确释放。
  4. HttpRequest:
    • 表示HTTP请求。
    • 包含请求行、请求头和请求体。
  5. HttpResponse:
    • 表示HTTP响应。
    • 包含状态行、响应头和响应体。
  6. HttpGet 和 HttpPost:
    • HttpRequest的具体实现,分别对应HTTP的GET和POST方法。
  7. HttpClientConnectionManager:
    • 负责管理HTTP连接。
    • 提供了获取连接、释放连接等方法。
  8. PoolingHttpClientConnectionManager:
    • HttpClientConnectionManager的一个具体实现。
    • 提供了连接池功能,以复用HTTP连接。
  9. HttpClientConnectionOperator:
    • 负责创建和管理底层的HTTP连接(如ManagedHttpClientConnection)。
  10. ManagedHttpClientConnection:
    • 表示底层的HTTP连接。
    • 封装了与远程服务器的通信过程。
  11. HttpHost:
    • 表示目标服务器的地址信息。
    • 包含主机名、端口号和协议类型。
  12. InetSocketAddress:
    • Java标准库中的类,用于表示IP地址和端口号的组合。
    • 在HttpClient中用于将HttpHost转换为具体的网络地址。
  13. SocketConfig:
    • 定义了套接字连接的相关配置。
    • 如超时时间、TCP参数等。
  14. HttpContext:
    • 提供在HTTP请求执行期间传递上下文信息的机制。
    • 允许用户在请求之间共享状态信息。
  15. DnsResolver:
    • 负责将主机名解析为IP地址。

4、设计原则

  1. 模块化与解耦:将HTTP客户端的不同功能划分为独立的组件和类,使得代码更加清晰、易于维护和扩展。每个组件和类都有明确的职责,并且它们之间的依赖关系相对简单,便于测试和替换。
  2. 灵活性:通过HttpClientBuilder,用户可以轻松地配置HttpClient的各种参数,以适应不同的使用场景和需求。这种灵活性使得HttpClient库能够适用于各种复杂的HTTP通信场景。
  3. 性能优化:通过引入连接池(如PoolingHttpClientConnectionManager),HttpClient库能够复用HTTP连接,减少了建立和关闭连接的开销,从而提高了性能。此外,底层的ManagedHttpClientConnection和SocketConfig也提供了对底层网络通信的精细控制,进一步优化了性能。
  4. 可扩展性:HttpClient库的设计允许用户自定义和扩展组件。例如,用户可以实现自己的DnsResolver或HttpClientConnectionOperator来提供自定义的DNS解析或连接管理策略。这种可扩展性使得HttpClient库能够适应不断变化的需求和技术发展。

5、组件交互过程

  1. 使用HttpClientBuilder构建HttpClient:
    • 用户通过HttpClientBuilder配置HttpClient的各种参数,如连接池、超时设置等。
    • 构建完成后,用户获取到一个配置好的HttpClient实例。
  2. 创建HttpRequest:
    • 用户根据需要创建具体的HttpRequest实例,如HttpGet或HttpPost。
    • 每个HttpRequest实例都关联一个HttpHost,指明了请求的目标服务器。
  3. 执行请求并获取HttpResponse:
    • 用户调用HttpClient的execute方法,并传入HttpRequest实例。
    • HttpClient使用底层的HttpClientConnectionOperator和ManagedHttpClientConnection来建立和管理与远程服务器的连接。
    • 如果需要解析主机名,HttpClient会调用DnsResolver来解析HttpHost中的主机名。
    • HttpClient通过底层的连接发送HttpRequest,并等待服务器的响应。
    • 一旦收到响应,HttpClient将其封装为HttpResponse对象,并返回给用户。
  4. 处理响应和释放连接:
    • 用户从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 方法设置了连接池管理器。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2024-04-25,如有侵权请联系 cloudcommunity@tencent 删除框架连接配置apachehttpclient

本文标签: Apache HttpClient框架常用组件介绍