Apache HttpClient使用实例详解

 更新时间:2025年03月26日 09:28:25   作者:kmt-码上解决  
ApacheHttpClient是一个强大的Java HTTP客户端库,用于发送HTTP请求并处理响应,HttpClients提供了多种方法来创建和配置HTTP客户端实例,本文给大家介绍Apache HttpClient使用示例详解,感兴趣的朋友一起看看吧

一、Apache HttpClient 基础版

HttpClients 是 Apache HttpClient 库中的一个工具类,用于创建和管理 HTTP 客户端实例。Apache HttpClient 是一个强大的 Java HTTP 客户端库,用于发送 HTTP 请求并处理 HTTP 响应。HttpClients 提供了多种方法来创建和配置 HTTP 客户端实例。

以下是关于 HttpClients 的详细讲解:

1. Apache HttpClient 简介

Apache HttpClient 是一个开源的 Java HTTP 客户端库,支持 HTTP/1.1 和 HTTP/2 协议。它提供了丰富的功能,例如:

  • 发送 GET、POST、PUT、DELETE 等 HTTP 请求。
  • 处理 HTTP 请求和响应的头部、状态码、实体等。
  • 支持连接池、重试机制、代理、SSL/TLS 等高级功能。

2. HttpClients 类的作用

HttpClients 是一个工厂类,用于创建 CloseableHttpClient 实例。CloseableHttpClient 是 HTTP 客户端的主要接口,用于执行 HTTP 请求。

HttpClients 提供了多种静态方法来创建和配置 HTTP 客户端实例,例如:

  • 创建默认的 HTTP 客户端。
  • 创建自定义配置的 HTTP 客户端。
  • 创建支持连接池的 HTTP 客户端。

3. HttpClients 的常用方法

(1) HttpClients.createDefault()

  • 功能: 创建一个默认的 HTTP 客户端实例。
  • 特点
    • 使用默认的配置(例如连接池、重试机制等)。
    • 适合大多数简单的 HTTP 请求场景。
  • 示例
CloseableHttpClient httpClient = HttpClients.createDefault();

(2) HttpClients.createSystem()

  • 功能: 创建一个基于系统属性的 HTTP 客户端实例。
  • 特点
    • 使用系统属性(例如代理设置、超时时间等)来配置客户端。
    • 适合需要与系统配置集成的场景。
  • 示例:
CloseableHttpClient httpClient = HttpClients.createSystem();

(3) HttpClients.custom()

  • 功能: 返回一个 HttpClientBuilder 对象,用于自定义配置 HTTP 客户端。
  • 特点
    • 可以设置连接池、超时时间、代理、SSL/TLS 等高级配置。
    • 适合需要精细控制的场景。
  • 示例
 CloseableHttpClient httpClient = HttpClients.custom()
     .setMaxConnTotal(100) // 最大连接数
     .setMaxConnPerRoute(10) // 每个路由的最大连接数
     .build();

4. HttpClients 的使用示例

以下是一个完整的示例,展示如何使用 HttpClients 发送 HTTP GET 请求并处理响应:

 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.util.EntityUtils;
 ​
 public class HttpClientExample {
     public static void main(String[] args) {
         // 1. 创建 HTTP 客户端
         try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
             // 2. 创建 HTTP GET 请求
             HttpGet request = new HttpGet("https://jsonplaceholder.typicode.com/posts/1");
 ​
             // 3. 发送请求并获取响应
             try (CloseableHttpResponse response = httpClient.execute(request)) {
                 // 4. 检查响应状态码
                 int statusCode = response.getStatusLine().getStatusCode();
                 System.out.println("Status Code: " + statusCode);
 ​
                 // 5. 获取响应内容
                 String responseBody = EntityUtils.toString(response.getEntity());
                 System.out.println("Response Body: " + responseBody);
             }
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
 }

5. HttpClients 的高级配置

通过 HttpClients.custom() 方法,可以自定义 HTTP 客户端的配置。以下是一些常见的配置选项:

(1) 连接池配置

 CloseableHttpClient httpClient = HttpClients.custom()
     .setMaxConnTotal(100) // 最大连接数
     .setMaxConnPerRoute(10) // 每个路由的最大连接数
     .build();

(2) 超时配置

 RequestConfig requestConfig = RequestConfig.custom()
     .setConnectTimeout(5000) // 连接超时时间
     .setSocketTimeout(5000) // 读取超时时间
     .build();
 ​
 CloseableHttpClient httpClient = HttpClients.custom()
     .setDefaultRequestConfig(requestConfig)
     .build();

(3) 代理配置

 HttpHost proxy = new HttpHost("proxy.example.com", 8080);
 ​
 CloseableHttpClient httpClient = HttpClients.custom()
     .setProxy(proxy)
     .build();

(4) SSL/TLS 配置

 SSLContext sslContext = SSLContexts.custom()
     .loadTrustMaterial((chain, authType) -> true) // 信任所有证书
     .build();
 ​
 CloseableHttpClient httpClient = HttpClients.custom()
     .setSSLContext(sslContext)
     .build();

6. 注意事项

资源释放CloseableHttpClientCloseableHttpResponse 都实现了 Closeable 接口,使用后需要关闭以释放资源。

线程安全CloseableHttpClient 是线程安全的,可以在多线程环境中共享。

性能优化: 使用连接池和合理的超时配置可以显著提升性能。

7. 总结

  • HttpClients 是 Apache HttpClient 库中的一个工具类,用于创建和管理 HTTP 客户端实例。
  • 它提供了多种方法来创建默认或自定义配置的 HTTP 客户端。
  • 通过 HttpClients.custom() 方法,可以实现连接池、超时、代理、SSL/TLS 等高级配置。
  • 使用 Apache HttpClient 可以轻松发送 HTTP 请求并处理响应,是 Java 中处理 HTTP 请求的强大工具。

二、Apache HttpClient 高级版

1. HttpClients 类概述

HttpClients 是 Apache HttpClient 库中的一个工厂类,用于创建和配置 CloseableHttpClient 实例。它是构建 HTTP 客户端的入口点,支持高度自定义的 HTTP 请求处理,包括连接池管理、SSL/TLS 配置、重试机制等。

2. 核心方法与配置

2.1 创建默认客户端

CloseableHttpClient httpClient = HttpClients.createDefault();

特点

  • 使用默认的配置(连接池、请求重试等)。
  • 适合简单场景,但扩展性有限。

2.2 自定义配置客户端

通过 HttpClients.custom() 返回 HttpClientBuilder,允许精细化配置:

 CloseableHttpClient httpClient = HttpClients.custom()
     .setConnectionManager(connectionManager)  // 连接池管理
     .setDefaultRequestConfig(requestConfig)   // 请求超时配置
     .setRetryHandler(retryHandler)            // 请求重试策略
     .setProxy(proxy)                          // 代理设置
     .setSSLContext(sslContext)                // SSL/TLS 配置
     .build();

3. 高级配置详解

3.1 连接池管理

连接池是提升性能的关键组件,避免频繁创建和销毁连接。

 PoolingHttpClientConnectionManager connectionManager = 
     new PoolingHttpClientConnectionManager();
 connectionManager.setMaxTotal(200);          // 最大总连接数
 connectionManager.setDefaultMaxPerRoute(20); // 每个路由(目标主机)的最大连接数
 ​
 CloseableHttpClient httpClient = HttpClients.custom()
     .setConnectionManager(connectionManager)
     .build();

3.2 超时配置

 RequestConfig requestConfig = RequestConfig.custom()
     .setConnectTimeout(5000)    // 连接建立超时时间(毫秒)
     .setSocketTimeout(10000)     // 数据传输超时时间(毫秒)
     .setConnectionRequestTimeout(2000) // 从连接池获取连接的超时时间
     .build();
 ​
 CloseableHttpClient httpClient = HttpClients.custom()
     .setDefaultRequestConfig(requestConfig)
     .build();

3.3 重试机制

自动重试失败的请求(例如网络波动导致失败):

 HttpRequestRetryHandler retryHandler = (exception, executionCount, context) -> {
     if (executionCount >= 3) return false; // 最大重试次数
     if (exception instanceof NoHttpResponseException) return true; // 无响应时重试
     return false;
 };
 ​
 CloseableHttpClient httpClient = HttpClients.custom()
     .setRetryHandler(retryHandler)
     .build();

3.4 代理配置

 HttpHost proxy = new HttpHost("proxy.example.com", 8080);
 CloseableHttpClient httpClient = HttpClients.custom()
     .setProxy(proxy)
     .build();

3.5 SSL/TLS 配置

信任所有证书(仅限测试环境):

 SSLContext sslContext = SSLContexts.custom()
     .loadTrustMaterial((chain, authType) -> true) // 信任所有证书
     .build();
 ​
 CloseableHttpClient httpClient = HttpClients.custom()
     .setSSLContext(sslContext)
     .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE) // 跳过主机名验证
     .build();

3.6 认证机制

使用 Basic 认证:

 CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
 credentialsProvider.setCredentials(
     new AuthScope("host.example.com", 80),
     new UsernamePasswordCredentials("user", "pass")
 );
 ​
 CloseableHttpClient httpClient = HttpClients.custom()
     .setDefaultCredentialsProvider(credentialsProvider)
     .build();

4. 请求与响应处理

4.1 发送 GET 请求

 HttpGet httpGet = new HttpGet("https://api.example.com/data");
 try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
     int statusCode = response.getStatusLine().getStatusCode();
     HttpEntity entity = response.getEntity();
     String content = EntityUtils.toString(entity);
     EntityUtils.consume(entity); // 确保资源释放
 }

4.2 发送 POST 请求(JSON 数据)

 HttpPost httpPost = new HttpPost("https://api.example.com/create");
 StringEntity jsonEntity = new StringEntity("{\"key\":\"value\"}", ContentType.APPLICATION_JSON);
 httpPost.setEntity(jsonEntity);
 ​
 try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
     // 处理响应...
 }

4.3 文件上传(Multipart)

 HttpPost httpPost = new HttpPost("https://api.example.com/upload");
 FileBody fileBody = new FileBody(new File("path/to/file"));
 MultipartEntityBuilder builder = MultipartEntityBuilder.create()
     .addPart("file", fileBody)
     .addTextBody("comment", "File upload");
 httpPost.setEntity(builder.build());

5. 高级功能

5.1 异步请求

使用 HttpAsyncClients 实现异步非阻塞请求:

 CloseableHttpAsyncClient asyncClient = HttpAsyncClients.custom().build();
 asyncClient.start();
 ​
 SimpleHttpRequest request = SimpleHttpRequest.get("https://api.example.com/data");
 Future<SimpleHttpResponse> future = asyncClient.execute(request, new FutureCallback<>() {
     @Override
     public void completed(SimpleHttpResponse response) {
         System.out.println("Response: " + response.getBodyText());
     }
 ​
     @Override
     public void failed(Exception ex) {
         ex.printStackTrace();
     }
 ​
     @Override
     public void cancelled() {
         System.out.println("Request cancelled");
     }
 });

5.2 请求拦截器

添加自定义逻辑(如日志记录、修改请求头):

 CloseableHttpClient httpClient = HttpClients.custom()
     .addInterceptorFirst((HttpRequestInterceptor) (request, context) -> {
         request.addHeader("X-Custom-Header", "value");
         System.out.println("Request URI: " + request.getRequestLine().getUri());
     })
     .build();

5.3 Cookie 管理

自动管理 Cookie:

 CookieStore cookieStore = new BasicCookieStore();
 CloseableHttpClient httpClient = HttpClients.custom()
     .setDefaultCookieStore(cookieStore)
     .build();

6. 最佳实践与常见问题

6.1 资源释放

确保关闭 CloseableHttpClientCloseableHttpResponse

 try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
     try (CloseableHttpResponse response = httpClient.execute(request)) {
         // 处理响应...
     }
 }

6.2 性能调优

  • 连接池参数:根据并发需求调整 MaxTotalDefaultMaxPerRoute
  • 超时设置:避免因网络问题导致线程阻塞。
  • 重用连接:复用 HttpClient 实例而非频繁创建。

6.3 错误处理

  • 重试策略:针对可恢复错误(如超时)配置自动重试。
  • 异常捕获:处理 IOExceptionClientProtocolException 等。

6.4 安全性

  • 生产环境禁用信任所有证书:使用有效 CA 签名的证书。
  • 敏感信息保护:避免在日志中打印请求头或响应体中的敏感数据。

7. 典型应用场景

  • 微服务间通信:在分布式系统中通过 HTTP 调用其他服务。
  • API 集成:调用第三方 RESTful API(如支付网关、地图服务)。
  • 爬虫开发:抓取网页内容并解析数据。
  • 文件传输:上传/下载文件到远程服务器。
  • 测试自动化:模拟客户端发送 HTTP 请求验证接口功能。

8. 官方文档与资源

Apache HttpClient 官方文档Apache HttpComponents – HttpClient Overview

GitHub 仓库https://github.com/apache/httpcomponents-client

到此这篇关于Apache HttpClient使用的文章就介绍到这了,更多相关Apache HttpClient使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Linux安装NFS全过程

    Linux安装NFS全过程

    这篇文章主要介绍了Linux安装NFS全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • deepin linux 手动升级内核的方法

    deepin linux 手动升级内核的方法

    这篇文章主要介绍了deepin linux 手动升级内核的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • 关于AIX挂载NFS写入效率低效的解决方法

    关于AIX挂载NFS写入效率低效的解决方法

    这篇文章主要给大家介绍了关于AIX挂载NFS写入效率低效的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • linux 触摸屏驱动编写

    linux 触摸屏驱动编写

    这篇文章主要介绍了linux 触摸屏驱动编写,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • Ubuntu下Subversion(SVN)的快速安装与配置详解

    Ubuntu下Subversion(SVN)的快速安装与配置详解

    这篇文章主要介绍了Ubuntu下Subversion(SVN)的快速安装与配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Linux系统安装Samba服务器实现过程

    Linux系统安装Samba服务器实现过程

    本文介绍了如何在CentOS7系统上安装和配置Samba服务器,以实现Windows和Linux系统之间的文件共享
    2026-02-02
  • Linux使用crontab定时执行脚本任务的流程详解

    Linux使用crontab定时执行脚本任务的流程详解

    在Linux中可以使用crontab来定时执行脚本,crontab是一个用于管理定时任务的工具,可以让在特定的时间间隔内自动运行脚本或命令,本文我们将使用cron来定期执行一个写入命令或脚本,需要的朋友可以参考下
    2023-10-10
  • CentOS 7 安装vsftpd 服务器的具体操作步骤

    CentOS 7 安装vsftpd 服务器的具体操作步骤

    下面小编就为大家带来一篇CentOS 7 安装vsftpd 服务器的具体操作步骤。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Linux实现添加新用户及创建主目录方式

    Linux实现添加新用户及创建主目录方式

    这篇文章主要介绍了Linux实现添加新用户及创建主目录方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • centos7系统下python2与python3共存

    centos7系统下python2与python3共存

    这篇文章主要给大家介绍了关于在centos7系统下python2与python3共存的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用centos7爬虫具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08

最新评论