当前位置: 首页 > news >正文

推荐HttpClient工具类

依赖

<!-- Apache HttpClient 核心依赖 -->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.13</version> <!-- 或更高版本 -->
</dependency>

<!-- SSL/TLS 支持 -->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient-cache</artifactId>
    <version>4.5.13</version>
</dependency>

<!-- 日志实现(按需选其一) -->
<!-- 方案1:Logback -->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.11</version>
</dependency>

<!-- 方案2:Log4j2 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.17.2</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.17.2</version>
</dependency>

关键依赖说明:

  1. httpclient:提供核心HTTP客户端功能
  2. httpclient-cache:包含SSL/TLS支持所需类(如SSLConnectionSocketFactory
  3. 日志依赖:必须添加日志实现才能看到连接池的DEBUG日志

验证依赖是否齐全的小技巧:

mvn dependency:tree | grep 'httpclient'
# 应该看到:
# org.apache.httpcomponents:httpclient:jar:4.5.13
# org.apache.httpcomponents:httpcore:jar:4.4.15
# org.apache.httpcomponents:httpclient-cache:jar:4.5.13

工具类

import org.apache.http.*;
import org.apache.http.client.config.*;
import org.apache.http.conn.ssl.*;
import org.apache.http.impl.client.*;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import javax.net.ssl.*;
import java.security.cert.X509Certificate;

public class HttpsDiagnosisClient {
    private static volatile CloseableHttpClient httpClient;
    private static final int MAX_TOTAL = 1000;
    private static final int MAX_PER_ROUTE = 200;
    private static final int CONN_REQUEST_TIMEOUT = 1000; // 连接池获取超时
    private static final int CONNECT_TIMEOUT = 250;       // 连接建立超时
    private static final int SOCKET_TIMEOUT = 1000;      // 数据传输超时

    // 双重检查锁单例模式
    public static CloseableHttpClient getInstance() {
        if (httpClient == null) {
            synchronized (HttpsDiagnosisClient.class) {
                if (httpClient == null) {
                    httpClient = createHttpsClient();
                }
            }
        }
        return httpClient;
    }

    private static CloseableHttpClient createHttpsClient() {
        try {
            // 1. 创建信任所有证书的SSL上下文(生产环境建议使用正式证书)
            SSLContext sslContext = SSLContexts.custom()
                    .loadTrustMaterial(null, (X509Certificate[] chain, String authType) -> true)
                    .build();

            // 2. 配置连接池(关键!开启诊断)
            PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();
            connManager.setMaxTotal(MAX_TOTAL);
            connManager.setDefaultMaxPerRoute(MAX_PER_ROUTE);
            
            // 3. 创建带诊断的HttpClient
            return HttpClients.custom()
                    .setConnectionManager(connManager)
                    .setSSLSocketFactory(new SSLConnectionSocketFactory(sslContext,
                            new String[]{"TLSv1.2", "TLSv1.3"}, // 指定TLS版本
                            null,
                            NoopHostnameVerifier.INSTANCE))
                    .setDefaultRequestConfig(RequestConfig.custom()
                            .setConnectionRequestTimeout(CONN_REQUEST_TIMEOUT)
                            .setConnectTimeout(CONNECT_TIMEOUT)
                            .setSocketTimeout(SOCKET_TIMEOUT)
                            .build())
                    // 添加耗时拦截器
                    .addInterceptorLast(new TimingInterceptor())
                    .build();
        } catch (Exception e) {
            throw new RuntimeException("创建HTTPS客户端失败", e);
        }
    }

    // 耗时统计拦截器
    private static class TimingInterceptor implements HttpResponseInterceptor {
        @Override
        public void process(HttpResponse response, HttpContext context) {
            HttpClientContext clientContext = HttpClientContext.adapt(context);
            TimingInfo timing = clientContext.getAttribute("timing", TimingInfo.class);
            
            if (timing != null) {
                long totalTime = System.currentTimeMillis() - timing.startTime;
                System.out.printf("""
                    [HTTP Timing Diagnostics]
                    |-- 连接池等待: %dms
                    |-- DNS解析: %dms
                    |-- TCP握手: %dms
                    |-- SSL握手: %dms
                    |-- 请求发送: %dms
                    |-- 响应接收: %dms
                    |-- 总耗时: %dms
                    """, 
                    timing.connectionPoolTime,
                    timing.dnsTime,
                    timing.tcpHandshakeTime,
                    timing.sslHandshakeTime,
                    timing.requestSendTime,
                    timing.responseReceiveTime,
                    totalTime);
            }
        }
    }

    // 计时信息载体
    private static class TimingInfo {
        long startTime;
        long connectionPoolTime;
        long dnsTime;
        long tcpHandshakeTime;
        long sslHandshakeTime;
        long requestSendTime;
        long responseReceiveTime;
    }
}

需要配合以下日志配置(logback.xml示例):

<!-- 连接池状态监控 -->
<logger name="org.apache.http.impl.conn.PoolingHttpClientConnectionManager" level="DEBUG"/>
  
<!-- 各阶段耗时日志 -->
<logger name="org.apache.http.impl.execchain" level="TRACE"/>
<logger name="org.apache.http.client.protocol" level="DEBUG"/>

工具类特点:

  1. HTTPS优化
    • 指定TLSv1.2+协议

相关文章:

  • 2025.3.20总结
  • 暗光增强技术研究进展与产品落地综合分析(2023-2025)
  • dfs(二十二)78. 子集
  • 自动驾驶AEB误触发率评估的必要测试里程估计
  • 网络安全技术分析:攻防演进、核心技术与未来挑战
  • SpringBoot3+Vue3开发学生成绩管理系统
  • Milvus vs. ElasticSearch:向量库检索性能测试
  • 中断服务函数和回调函数的理解
  • 介绍一下TiDB、RocksDb、levelDB、LSM 树、SSTable。
  • 2025年R1 快开门式压力容器操作证考试题目及答案解析
  • 【“缘起”:万物依条件而生】
  • dart学习记录4(循环、分钟、错误处理)
  • 【AI News | 20250320】每日AI进展
  • MyBatis 执行流程详解:一级缓存与二级缓存深度解析
  • QT并发编程进阶--线程安全与同步技巧详解
  • css-grid布局
  • 日期类的实现
  • 基于复杂的商业和政策信息构建GraphRAG,并结合通义千问大模型进行问答的应用场景
  • 美团Leaf分布式ID实战:深入解析雪花算法原理与应用
  • 网络空间安全(38)Windows/Linux权限
  • 让中小学生体验不同职业,上海中高职院校提供超5万个体验名额
  • 远洋渔船上的命案
  • 人民日报大家谈:为基层减负,治在根子上减到点子上
  • 上海位居全球40城科技传播能力第六名
  • 上海天文馆走进徐家汇书院,XR沉浸式天文科普体验再推力作
  • 著名文博专家吴远明因交通事故离世,享年75岁