HttpClient介绍和使用

系列

  • HttpClient介绍和使用
  • HttpClient连接池管理

简介

  • HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。

  • Apache Jakarta Commons HttpClient项目已经寿终正寝,不再开发和维护。取而代之的是Apache Httpcomponents项目,它包括HttpClient和HttpCore两大模块,能提供更好的性能和更大的灵活性。

  • 之所以会尝试写这篇博客是因为在最近的工作中使用到了HttpClient,而对于使用的技术还是希望稍微能够理解的深入一些。

  • 目前我们的使用的版本是基于4.5.x,可以从httpcomponents-client获取源码并切换到4.5.x版本后阅读example版本进行了解。


使用场景



    org.apache.httpcomponents
    httpclient
    4.5.13




    org.apache.httpcomponents
    httpcore
    4.4.14

  • httpclient的4.5.x版本需要依赖httpclient和httpcore两个依赖包,httpclient作为http请求的客户端,httpcore作为连接的管理。
public class ClientExample {

    public static void main(String[] args) throws Exception {

        // 1、设置连接管理器
        ConnectionSocketFactory plainsf = PlainConnectionSocketFactory.getSocketFactory();
        LayeredConnectionSocketFactory sslsf = SSLConnectionSocketFactory.getSocketFactory();
        Registry registry = RegistryBuilder
                . create().register("http", plainsf).register("https", sslsf).build();
        PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry);
        cm.setMaxTotal(1000);
        cm.setDefaultMaxPerRoute(500);

        // 2、创建请求配置核心设置超时
        RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(1000)
                .setConnectTimeout(1000).setSocketTimeout(2000).build();

        // 3、创建Httpclient对象
        CloseableHttpClient httpclient = HttpClients.custom()
                .setConnectionManager(cm)
                .setDefaultRequestConfig(requestConfig)
                .build();

        // 4、发送请求并解析返回值
        HttpGet httpGet = new HttpGet("http://hc.apache.org/");
        CloseableHttpResponse response = httpclient.execute(httpGet);
        try {
            // 解析返回值
            HttpEntity entity = response.getEntity();
            String result = EntityUtils.toString(entity, Charset.forName("utf8"));
            EntityUtils.consume(entity);
        } catch (Exception e) {

        } finally {
            // 关闭并释放连接,可能多余
            response.close();
        }
    }
}
  • 设置连接管理器PoolingHttpClientConnectionManager,负责管理连接池。
  • 创建请求配置RequestConfig并设置核心的超时属性等,核心是超时时间设置。
  • 创建Httpclient对象并通过httpclient.execute操作发送请求解析结果
  • 关闭连接,这部分可能是多余,因为ntityUtils.toString操作已经释放连接。


请求过程解析

  • HttpClient的请求过程主要通过InternalHttpClient来实现请求过程。
  • 整个执行过程中通过职责链进行操作并最终HttpRequestExecutor访问。
  • HttpClient在整个访问过程中的职责链


连接池

  • HttpClient的连接池使用CPool来实现,AbstractConnPool作为全局的CPool。
  • routeToPool属于请求维度的线程池维护。
  • 另外一种视角的CPool的整体架构。


参考

  • HttpClient中文官网
  • Java CloseableHttpResponse.close方法代碼示例

你可能感兴趣的:(HttpClient介绍和使用)