使用示例
maven依賴:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
執(zhí)行連接請(qǐng)求示例:
// httpclient客戶端算墨,類似于一個(gè)瀏覽器,可以由這個(gè)客戶端執(zhí)行http請(qǐng)求
CloseableHttpClient httpClient = HttpClients.createDefault();
// 請(qǐng)求
HttpGet httpGet = new HttpGet("http://www.reibang.com/");
// 響應(yīng)
CloseableHttpResponse response = null;
try {
// execute()執(zhí)行成功會(huì)返回HttpResponse響應(yīng)
response = httpClient.execute(httpGet);
// 響應(yīng)體
HttpEntity responseEntity = response.getEntity();
System.out.println("響應(yīng)狀態(tài):" + response.getStatusLine());
// gzip,deflate,compress
System.out.println("響應(yīng)體編碼方式:" + responseEntity.getContentEncoding());
// 響應(yīng)類型如text/html charset也有可能在ContentType中
System.out.println("響應(yīng)體類型:" + responseEntity.getContentType());
/**
* EntityUtils.toString()方法會(huì)將響應(yīng)體的輸入流關(guān)閉壮锻,相當(dāng)于消耗了響應(yīng)體窒典,
* 此時(shí)連接會(huì)回到httpclient中的連接管理器的連接池中亡脑,如果下次訪問(wèn)的路由
* 是一樣的(如第一次訪問(wèn)http://www.reibang.com/,第二次訪問(wèn)
* http://www.reibang.com/search?q=java&page=1&type=note)惊完,
* 則此連接可以被復(fù)用捷枯。
*/
System.out.println("響應(yīng)體內(nèi)容:" + EntityUtils.toString(responseEntity));
// 如果關(guān)閉了httpEntity的inputStream,httpEntity長(zhǎng)度應(yīng)該為0专执,而且再次請(qǐng)求相同路由的連接可以共用一個(gè)連接。
// 可以通過(guò)設(shè)置連接管理器最大連接為1來(lái)驗(yàn)證郁油。
response = httpClient.execute(httpGet);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (response != null) {
// 關(guān)閉連接本股,則此次連接被丟棄
response.close();
}
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
創(chuàng)建默認(rèn)的CloseableHttpClient實(shí)例中有一個(gè)連接管理器,最大連接數(shù)為20桐腌,每個(gè)路由最大連接數(shù)為2拄显。因?yàn)橛辛诉B接管理器對(duì)連接的管理,我們可以放心的使用多線程來(lái)執(zhí)行請(qǐng)求案站,可以有多個(gè)HttpClient(我覺(jué)得沒(méi)有很大必要)躬审,但是必須將他們?cè)O(shè)置成同一個(gè)連接管理器,才能達(dá)到共用連接的目的。