• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    Apache HttpClient使用实例详解

    发布者: 怀卉1097 | 发布时间: 2025-8-15 04:02| 查看数: 100| 评论数: 0|帖子模式

    一、Apache HttpClient 基础版
    1. HttpClients
    复制代码
    是 Apache HttpClient 库中的一个工具类,用于创建和管理 HTTP 客户端实例。Apache HttpClient 是一个强大的 Java HTTP 客户端库,用于发送 HTTP 请求并处理 HTTP 响应。
    1. HttpClients
    复制代码
    提供了多种方法来创建和配置 HTTP 客户端实例。
    以下是关于
    1. HttpClients
    复制代码
    的详细讲解:

    1. Apache HttpClient 简介

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

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

    2. HttpClients 类的作用
    1. HttpClients
    复制代码
    是一个工厂类,用于创建
    1. CloseableHttpClient
    复制代码
    实例。
    1. CloseableHttpClient
    复制代码
    是 HTTP 客户端的主要接口,用于执行 HTTP 请求。
    1. HttpClients
    复制代码
    提供了多种静态方法来创建和配置 HTTP 客户端实例,例如:

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

    3. HttpClients 的常用方法

    (1)
    1. HttpClients.createDefault()
    复制代码

    • 功能: 创建一个默认的 HTTP 客户端实例。
    • 特点

      • 使用默认的配置(例如连接池、重试机制等)。
      • 适合大多数简单的 HTTP 请求场景。

    • 示例
    1. CloseableHttpClient httpClient = HttpClients.createDefault();
    复制代码
    (2)
    1. HttpClients.createSystem()
    复制代码

    • 功能: 创建一个基于系统属性的 HTTP 客户端实例。
    • 特点

      • 使用系统属性(例如代理设置、超时时间等)来配置客户端。
      • 适合需要与系统配置集成的场景。

    • 示例:
    1. CloseableHttpClient httpClient = HttpClients.createSystem();
    复制代码
    (3)
    1. HttpClients.custom()
    复制代码

    • 功能: 返回一个
      1. HttpClientBuilder
      复制代码
      对象,用于自定义配置 HTTP 客户端。
    • 特点

      • 可以设置连接池、超时时间、代理、SSL/TLS 等高级配置。
      • 适合需要精细控制的场景。

    • 示例
    1. CloseableHttpClient httpClient = HttpClients.custom()
    2.      .setMaxConnTotal(100) // 最大连接数
    3.      .setMaxConnPerRoute(10) // 每个路由的最大连接数
    4.      .build();
    复制代码
    4. HttpClients 的使用示例

    以下是一个完整的示例,展示如何使用
    1. HttpClients
    复制代码
    发送 HTTP GET 请求并处理响应:
    1. import org.apache.http.client.methods.CloseableHttpResponse;
    2. import org.apache.http.client.methods.HttpGet;
    3. import org.apache.http.impl.client.CloseableHttpClient;
    4. import org.apache.http.impl.client.HttpClients;
    5. import org.apache.http.util.EntityUtils;

    6. public class HttpClientExample {
    7.      public static void main(String[] args) {
    8.          // 1. 创建 HTTP 客户端
    9.          try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
    10.              // 2. 创建 HTTP GET 请求
    11.              HttpGet request = new HttpGet("https://jsonplaceholder.typicode.com/posts/1");

    12.              // 3. 发送请求并获取响应
    13.              try (CloseableHttpResponse response = httpClient.execute(request)) {
    14.                  // 4. 检查响应状态码
    15.                  int statusCode = response.getStatusLine().getStatusCode();
    16.                  System.out.println("Status Code: " + statusCode);

    17.                  // 5. 获取响应内容
    18.                  String responseBody = EntityUtils.toString(response.getEntity());
    19.                  System.out.println("Response Body: " + responseBody);
    20.              }
    21.          } catch (Exception e) {
    22.              e.printStackTrace();
    23.          }
    24.      }
    25. }
    复制代码
    5. HttpClients 的高级配置

    通过
    1. HttpClients.custom()
    复制代码
    方法,可以自定义 HTTP 客户端的配置。以下是一些常见的配置选项:
    (1) 连接池配置
    1. CloseableHttpClient httpClient = HttpClients.custom()
    2.      .setMaxConnTotal(100) // 最大连接数
    3.      .setMaxConnPerRoute(10) // 每个路由的最大连接数
    4.      .build();
    复制代码
    (2) 超时配置
    1. RequestConfig requestConfig = RequestConfig.custom()
    2.      .setConnectTimeout(5000) // 连接超时时间
    3.      .setSocketTimeout(5000) // 读取超时时间
    4.      .build();

    5. CloseableHttpClient httpClient = HttpClients.custom()
    6.      .setDefaultRequestConfig(requestConfig)
    7.      .build();
    复制代码
    (3) 代理配置
    1. HttpHost proxy = new HttpHost("proxy.example.com", 8080);

    2. CloseableHttpClient httpClient = HttpClients.custom()
    3.      .setProxy(proxy)
    4.      .build();
    复制代码
    (4) SSL/TLS 配置
    1. SSLContext sslContext = SSLContexts.custom()
    2.      .loadTrustMaterial((chain, authType) -> true) // 信任所有证书
    3.      .build();

    4. CloseableHttpClient httpClient = HttpClients.custom()
    5.      .setSSLContext(sslContext)
    6.      .build();
    复制代码
    6. 注意事项

    资源释放
    1. CloseableHttpClient
    复制代码
    1. CloseableHttpResponse
    复制代码
    都实现了
    1. Closeable
    复制代码
    接口,使用后需要关闭以释放资源。
    线程安全
    1. CloseableHttpClient
    复制代码
    是线程安全的,可以在多线程环境中共享。
    性能优化: 使用连接池和合理的超时配置可以显著提升性能。

    7. 总结


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

    二、Apache HttpClient 高级版


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

    2. 核心方法与配置

    2.1 创建默认客户端
    1. CloseableHttpClient httpClient = HttpClients.createDefault();
    复制代码
    特点

    • 使用默认的配置(连接池、请求重试等)。
    • 适合简单场景,但扩展性有限。
    2.2 自定义配置客户端
    通过
    1. HttpClients.custom()
    复制代码
    返回
    1. HttpClientBuilder
    复制代码
    ,允许精细化配置:
    1. CloseableHttpClient httpClient = HttpClients.custom()
    2.      .setConnectionManager(connectionManager)  // 连接池管理
    3.      .setDefaultRequestConfig(requestConfig)   // 请求超时配置
    4.      .setRetryHandler(retryHandler)            // 请求重试策略
    5.      .setProxy(proxy)                          // 代理设置
    6.      .setSSLContext(sslContext)                // SSL/TLS 配置
    7.      .build();
    复制代码
    3. 高级配置详解

    3.1 连接池管理
    连接池是提升性能的关键组件,避免频繁创建和销毁连接。
    1. PoolingHttpClientConnectionManager connectionManager =
    2.      new PoolingHttpClientConnectionManager();
    3. connectionManager.setMaxTotal(200);          // 最大总连接数
    4. connectionManager.setDefaultMaxPerRoute(20); // 每个路由(目标主机)的最大连接数

    5. CloseableHttpClient httpClient = HttpClients.custom()
    6.      .setConnectionManager(connectionManager)
    7.      .build();
    复制代码
    3.2 超时配置
    1. RequestConfig requestConfig = RequestConfig.custom()
    2.      .setConnectTimeout(5000)    // 连接建立超时时间(毫秒)
    3.      .setSocketTimeout(10000)     // 数据传输超时时间(毫秒)
    4.      .setConnectionRequestTimeout(2000) // 从连接池获取连接的超时时间
    5.      .build();

    6. CloseableHttpClient httpClient = HttpClients.custom()
    7.      .setDefaultRequestConfig(requestConfig)
    8.      .build();
    复制代码
    3.3 重试机制
    自动重试失败的请求(例如网络波动导致失败):
    1. HttpRequestRetryHandler retryHandler = (exception, executionCount, context) -> {
    2.      if (executionCount >= 3) return false; // 最大重试次数
    3.      if (exception instanceof NoHttpResponseException) return true; // 无响应时重试
    4.      return false;
    5. };

    6. CloseableHttpClient httpClient = HttpClients.custom()
    7.      .setRetryHandler(retryHandler)
    8.      .build();
    复制代码
    3.4 代理配置
    1. HttpHost proxy = new HttpHost("proxy.example.com", 8080);
    2. CloseableHttpClient httpClient = HttpClients.custom()
    3.      .setProxy(proxy)
    4.      .build();
    复制代码
    3.5 SSL/TLS 配置
    信任所有证书(仅限测试环境):
    1. SSLContext sslContext = SSLContexts.custom()
    2.      .loadTrustMaterial((chain, authType) -> true) // 信任所有证书
    3.      .build();

    4. CloseableHttpClient httpClient = HttpClients.custom()
    5.      .setSSLContext(sslContext)
    6.      .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE) // 跳过主机名验证
    7.      .build();
    复制代码
    3.6 认证机制
    使用 Basic 认证:
    1. CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    2. credentialsProvider.setCredentials(
    3.      new AuthScope("host.example.com", 80),
    4.      new UsernamePasswordCredentials("user", "pass")
    5. );

    6. CloseableHttpClient httpClient = HttpClients.custom()
    7.      .setDefaultCredentialsProvider(credentialsProvider)
    8.      .build();
    复制代码
    4. 请求与响应处理

    4.1 发送 GET 请求
    1. HttpGet httpGet = new HttpGet("https://api.example.com/data");
    2. try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
    3.      int statusCode = response.getStatusLine().getStatusCode();
    4.      HttpEntity entity = response.getEntity();
    5.      String content = EntityUtils.toString(entity);
    6.      EntityUtils.consume(entity); // 确保资源释放
    7. }
    复制代码
    4.2 发送 POST 请求(JSON 数据)
    1. HttpPost httpPost = new HttpPost("https://api.example.com/create");
    2. StringEntity jsonEntity = new StringEntity("{"key":"value"}", ContentType.APPLICATION_JSON);
    3. httpPost.setEntity(jsonEntity);

    4. try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
    5.      // 处理响应...
    6. }
    复制代码
    4.3 文件上传(Multipart)
    1. HttpPost httpPost = new HttpPost("https://api.example.com/upload");
    2. FileBody fileBody = new FileBody(new File("path/to/file"));
    3. MultipartEntityBuilder builder = MultipartEntityBuilder.create()
    4.      .addPart("file", fileBody)
    5.      .addTextBody("comment", "File upload");
    6. httpPost.setEntity(builder.build());
    复制代码
    5. 高级功能

    5.1 异步请求
    使用
    1. HttpAsyncClients
    复制代码
    实现异步非阻塞请求:
    1. CloseableHttpAsyncClient asyncClient = HttpAsyncClients.custom().build();
    2. asyncClient.start();

    3. SimpleHttpRequest request = SimpleHttpRequest.get("https://api.example.com/data");
    4. Future<SimpleHttpResponse> future = asyncClient.execute(request, new FutureCallback<>() {
    5.      @Override
    6.      public void completed(SimpleHttpResponse response) {
    7.          System.out.println("Response: " + response.getBodyText());
    8.      }

    9.      @Override
    10.      public void failed(Exception ex) {
    11.          ex.printStackTrace();
    12.      }

    13.      @Override
    14.      public void cancelled() {
    15.          System.out.println("Request cancelled");
    16.      }
    17. });
    复制代码
    5.2 请求拦截器
    添加自定义逻辑(如日志记录、修改请求头):
    1. CloseableHttpClient httpClient = HttpClients.custom()
    2.      .addInterceptorFirst((HttpRequestInterceptor) (request, context) -> {
    3.          request.addHeader("X-Custom-Header", "value");
    4.          System.out.println("Request URI: " + request.getRequestLine().getUri());
    5.      })
    6.      .build();
    复制代码
    5.3 Cookie 管理
    自动管理 Cookie:
    1. CookieStore cookieStore = new BasicCookieStore();
    2. CloseableHttpClient httpClient = HttpClients.custom()
    3.      .setDefaultCookieStore(cookieStore)
    4.      .build();
    复制代码
    6. 最佳实践与常见问题

    6.1 资源释放
    确保关闭
    1. CloseableHttpClient
    复制代码
    1. CloseableHttpResponse
    复制代码
    1. try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
    2.      try (CloseableHttpResponse response = httpClient.execute(request)) {
    3.          // 处理响应...
    4.      }
    5. }
    复制代码
    6.2 性能调优

    • 连接池参数:根据并发需求调整
      1. MaxTotal
      复制代码
      1. DefaultMaxPerRoute
      复制代码

    • 超时设置:避免因网络问题导致线程阻塞。
    • 重用连接:复用
      1. HttpClient
      复制代码
      实例而非频繁创建。
    6.3 错误处理

    • 重试策略:针对可恢复错误(如超时)配置自动重试。
    • 异常捕获:处理
      1. IOException
      复制代码
      1. ClientProtocolException
      复制代码
      等。
    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使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:互联网
    免责声明:如果侵犯了您的权益,请联系站长(1277306191@qq.com),我们会及时删除侵权内容,谢谢合作!

    最新评论

    浏览过的版块

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表