如何将基于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.
相关产品推荐
相关产品推荐

