使用示例
maven依赖:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
执行连接请求示例:
// httpclient客户端,类似于一个浏览器,可以由这个客户端执行http请求
CloseableHttpClient httpClient = HttpClients.createDefault();
// 请求
HttpGet httpGet = new HttpGet("//www.greatytc.com/");
// 响应
CloseableHttpResponse response = null;
try {
// execute()执行成功会返回HttpResponse响应
response = httpClient.execute(httpGet);
// 响应体
HttpEntity responseEntity = response.getEntity();
System.out.println("响应状态:" + response.getStatusLine());
// gzip,deflate,compress
System.out.println("响应体编码方式:" + responseEntity.getContentEncoding());
// 响应类型如text/html charset也有可能在ContentType中
System.out.println("响应体类型:" + responseEntity.getContentType());
/**
* EntityUtils.toString()方法会将响应体的输入流关闭,相当于消耗了响应体,
* 此时连接会回到httpclient中的连接管理器的连接池中,如果下次访问的路由
* 是一样的(如第一次访问//www.greatytc.com/,第二次访问
* //www.greatytc.com/search?q=java&page=1&type=note),
* 则此连接可以被复用。
*/
System.out.println("响应体内容:" + EntityUtils.toString(responseEntity));
// 如果关闭了httpEntity的inputStream,httpEntity长度应该为0,而且再次请求相同路由的连接可以共用一个连接。
// 可以通过设置连接管理器最大连接为1来验证。
response = httpClient.execute(httpGet);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (response != null) {
// 关闭连接,则此次连接被丢弃
response.close();
}
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
创建默认的CloseableHttpClient实例中有一个连接管理器,最大连接数为20,每个路由最大连接数为2。因为有了连接管理器对连接的管理,我们可以放心的使用多线程来执行请求,可以有多个HttpClient(我觉得没有很大必要),但是必须将他们设置成同一个连接管理器,才能达到共用连接的目的。