从HttpClient4迁移至HttpClient5:无法使用setSSLContext方法
HttpClient 5 版本设置 SSLContext 替代方案
升级Apache HttpClient从4.x到5.x后,原代码中HttpClientBuilder.setSSLContext()方法被移除,报错:
The method setSSLContext(sslcontext) is undefined for the type HttpClientBuilder
原代码:
import org.apache.hc.client5.http.classic.HttpClient; import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; SSLContext sslcontext = SSLContext.getDefault(); HttpClient httpclient = HttpClientBuilder.create().setSSLContext(sslcontext).build(); ClientHttpRequestFactory reqFac = new HttpComponentsClientHttpRequestFactory(httpclient);
替代实现方案
在HttpClient 5.x中,需通过SSLConfig类封装SSLContext配置,再传递给HttpClientBuilder:
import org.apache.hc.client5.http.classic.HttpClient; import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; import org.apache.hc.client5.http.config.SSLConfig; // 获取默认SSLContext SSLContext sslcontext = SSLContext.getDefault(); // 构建SSLConfig并绑定SSLContext SSLConfig sslConfig = SSLConfig.custom() .setSslContext(sslcontext) .build(); // 创建HttpClient时传入配置好的SSLConfig HttpClient httpclient = HttpClientBuilder.create() .setSSLConfig(sslConfig) .build(); ClientHttpRequestFactory reqFac = new HttpComponentsClientHttpRequestFactory(httpclient);
扩展配置(可选)
如果需要自定义SSL协议、主机名验证规则等,可在SSLConfig.custom()中追加配置项:
SSLConfig sslConfig = SSLConfig.custom() .setSslContext(sslcontext) .setProtocols(new String[]{"TLSv1.2", "TLSv1.3"}) // 指定允许的SSL协议版本 .setHostnameVerifier(NoopHostnameVerifier.INSTANCE) // 关闭主机名验证(仅建议测试环境使用) .build();
内容的提问来源于stack exchange,提问作者Ravi
相关产品推荐
相关产品推荐

