CloseableHttpClient详解
实现项目中的HttpUtil用到CloseableHttpClient,httpUtil源码:https://download.csdn.net/download/imwucx/88378340
于是学习CloseableHttpClient并记录一下。
一、CloseableHttpClient是什么?
CloseableHttpClient实现了AutoCloseable接口和HttpClient接口,可以自动关闭连接管理器和销毁HttpClient实例。不仅可以简单设置请求头,还可以利用fastjson转换请求或返回结果字符串为json格式。
二、CloseableHttpClient优点
- 实现了HttpClient接口,具有HttpClient的优势。
- 支持连接池管理,即可复用已建立的连接。
- 自动管理连接释放。
- 支持GZIP解压。
- 支持HTTPS访问。
- 支持通用连接超时设置。
- 性能更优。
三、CloseableHttpClient使用
1、创建CloseableHttpClient实例
HttpClients.createDefault()
2、创建请求实例
HttpPost post = new HttpPost(url);
3、设置请求参数
StringEntity s = new StringEntity(json.toString());s.setContentEncoding("UTF-8");s.setContentType("application/json");post.setEntity(s);
4、执行请求
HttpResponse res = httpClient.execute(post);
5、处理返回结果
if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {HttpEntity entity = res.getEntity();String result = EntityUtils.toString(entity, "UTF-8");respJson = JSONObject.parseObject(result);}
6、连接池
使用连接池来提高性能
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create().register("http", PlainConnectionSocketFactory.INSTANCE).register("https", createSSLConnSocketFactory()).build();// 设置连接池PoolingHttpClientConnectionManager connMgr = new PoolingHttpClientConnectionManager(socketFactoryRegistry);// 设置连接池大小connMgr.setMaxTotal(100);connMgr.setDefaultMaxPerRoute(connMgr.getMaxTotal());CloseableHttpClient httpclient = HttpClients.custom().setConnectionManager(connMgr).build();
7、关闭连接池
httpClient.close();
在应用程序结束时,应关闭连接管理器以释放所有的系统资源。
四、高级用法
- 请求超时时间
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create().register("http", PlainConnectionSocketFactory.INSTANCE).register("https", createSSLConnSocketFactory()).build();// 设置连接池PoolingHttpClientConnectionManager connMgr = new PoolingHttpClientConnectionManager(socketFactoryRegistry);// 设置连接池大小connMgr.setMaxTotal(100);connMgr.setDefaultMaxPerRoute(connMgr.getMaxTotal());RequestConfig.Builder configBuilder = RequestConfig.custom();// 设置连接超时configBuilder.setConnectTimeout(MAX_TIMEOUT);// 设置读取超时configBuilder.setSocketTimeout(MAX_TIMEOUT);// 设置从连接池获取连接实例的超时configBuilder.setConnectionRequestTimeout(MAX_TIMEOUT);// 在提交请求之前 测试连接是否可用configBuilder.setStaleConnectionCheckEnabled(true);requestConfig = configBuilder.build();CloseableHttpClient httpclient = HttpClients.custom().setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();
- 设置代理
HttpHost proxy = new HttpHost("127.0.0.1", 8080, "http");
RequestConfig config = RequestConfig.custom().setProxy(proxy).build();HttpGet httpGet = new HttpGet("http://www.example.com");
httpGet.setConfig(config);
- 设置cookie
CloseableHttpClient httpClient = HttpClients.createDefault();
CookieStore cookieStore = new BasicCookieStore();
CloseableHttpClient httpClient = HttpClients.custom().setDefaultCookieStore(cookieStore).build();
-
设置异常重试
CloseableHttpClient httpClient = HttpClients.custom().setRetryHandler(new DefaultHttpRequestRetryHandler(3, true)).build();