You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将基于SOCKS代理的HttpClient 4代码迁移至HttpClient 5?

HttpClient 4 基于SOCKS代理的代码迁移至HttpClient 5方案

HttpClient 5 已原生支持SOCKS代理配置,无需再维护自定义的SocksCompatibleConnectionSocketFactory和SocksCompatibleSSLConnectionSocketFactory类,以下是迁移后的完整实现:

迁移后的代码

InetSocketAddress socksaddr = new InetSocketAddress(
        (String) call.props.get(PROXY_HOST_NAME),
        Integer.parseInt((String) call.props.get(PROXY_PORT))
);

// 配置SOCKS代理路由规划器
DefaultProxyRoutePlanner proxyRoutePlanner = new DefaultProxyRoutePlanner(
        HttpHost.create("socks://" + socksaddr.getHostString() + ":" + socksaddr.getPort())
);

// 构建连接池管理器
PoolingHttpClientConnectionManager connectionManager = PoolingHttpClientConnectionManagerBuilder.create()
        .setMaxConnPerRoute(MxParam.getIntWithDefaultValueNoException(MAXCONECTIONPERHOST, 20))
        .setMaxConnTotal(MxParam.getIntWithDefaultValueNoException(MAXTOTALCONNECTION, 20))
        .build();

// 构建CloseableHttpClient实例
final CloseableHttpClient client = HttpClients.custom()
        .setConnectionManager(connectionManager)
        .setDefaultRequestConfig(RequestConfig.custom()
                .setConnectTimeout(MxParam.getIntWithDefaultValueNoException(WSTIMEOUT, 30000), TimeUnit.MILLISECONDS)
                .setSocketTimeout(MxParam.getIntWithDefaultValueNoException(WSTIMEOUT, 30000), TimeUnit.MILLISECONDS)
                .build())
        .setConnectionManagerShared(true)
        .useSystemProperties()
        .setRoutePlanner(proxyRoutePlanner)
        .build();

关键变化说明

  • 原生SOCKS代理支持:通过DefaultProxyRoutePlanner直接配置SOCKS类型的HttpHost(URL前缀为socks://),替代原自定义Socket工厂的逻辑。
  • 连接管理器更新:使用PoolingHttpClientConnectionManager(HttpClient5推荐的连接池实现)替代原BasicHttpClientConnectionManager,若需单连接场景可改用BasicHttpClientConnectionManager。
  • 超时API变更:HttpClient5的超时配置需指定TimeUnit,需注意参数传递。
  • 移除自定义类:原两个自定义Socket工厂类可直接删除,原生实现已覆盖SOCKS代理的Socket创建逻辑。

特殊场景下的自定义Socket工厂(可选)

若需自定义代理逻辑,HttpClient5中需实现org.apache.hc.client5.http.socket.ConnectionSocketFactory接口,通过PoolingHttpClientConnectionManagerBuilder.setSocketFactoryRegistry()注册,但多数场景下原生代理配置已足够。

内容的提问来源于stack exchange,提问作者Nicolas G.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 18:42:39