最近深度學習了下HttpClient 4.5.2谍肤,大家都知道,HttpClient 是Apache Jakarta Common 下的子項目哗伯,可以用來提供高效的荒揣、最新的、功能豐富的支持 HTTP 協(xié)議的客戶端編程工具包焊刹,并且它支持 HTTP 協(xié)議最新的版本和建議系任。
理解不是太深刻,理解錯誤之處還請指出虐块。廢話不多說俩滥,開始記錄。
使用工具
- HttpClient 4.5.2
-
maven地址
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.2</version> </dependency>
public static void main(String[] args) {
// 獲取連接客戶端工具
CloseableHttpClient httpClient = HttpClients.createDefault();
// 創(chuàng)建GET請求對象
HttpGet httpGet = new HttpGet("https://www.baidu.com");
String entityStr = null;
CloseableHttpResponse response = null;
try {
// 執(zhí)行請求
response = httpClient.execute(httpGet);
// 獲得響應的實體對象
HttpEntity entity = response.getEntity();
// 使用Apache提供的工具類進行轉換成字符串
entityStr = EntityUtils.toString(entity);
} catch (ClientProtocolException e) {
System.err.println("Http協(xié)議出現(xiàn)問題");
e.printStackTrace();
} catch (ParseException e) {
System.err.println("解析錯誤");
e.printStackTrace();
} catch (IOException e) {
System.err.println("IO異常");
e.printStackTrace();
} finally {
if (null != response) {
try {
// 釋放連接
response.close();
httpClient.close();
} catch (IOException e) {
System.err.println("釋放連接出錯");
e.printStackTrace();
}
}
}
// 打印響應內容
System.out.println(entityStr);
}
我們平常使用瀏覽器進行訪問網(wǎng)站時贺奠,httpClient
就相當于瀏覽器的一個標簽頁
举农,httpGet
就相當于瀏覽器上面的每一個超連接
。我們需要建立在已經(jīng)存在標簽頁的基礎上敞嗡,才能發(fā)起一個新的請求。EntityUtils
就相當于瀏覽器的渲染引擎航背,把服務端響應回來的數(shù)據(jù)解析出來喉悴,當然,這里解析出來的是字符串玖媚,而瀏覽器解析出來的結果是已經(jīng)渲染好的界面箕肃。httpClient
的每一次訪問都需要開啟一個Http連接,而每一個Http連接都是很珍貴的今魔,隨意這地方后邊會使用連接池
進行管理。
- 打印結果:
上圖所示,出現(xiàn)響應結果谒麦,但是細心可以發(fā)現(xiàn)弓颈,有一部分是
亂碼顯示
,這部分為中文亂碼
涩维。
解決辦法是把上面代碼中的entityStr = EntityUtils.toString(entity);
修改成entityStr = EntityUtils.toString(entity, "UTF-8");
指定編碼格式解析響應數(shù)據(jù)即可解決殃姓;
- 打印結果:
關于消耗HTTP實體內容
HttpClient推薦使用HttpEntity的getConent()方法或者HttpEntity的writeTo(OutputStream)方法來消耗掉Http實體內容。HttpClient也提供了EntityUtils
這個類瓦阐,這個類提供一些靜態(tài)方法可以更容易地讀取Http實體的內容和信息蜗侈。和以java.io.InputStream流讀取內容的方式相比,EntityUtils提供的方法可以以字符串或者字節(jié)數(shù)組的形式讀取Http實體睡蟋。但是踏幻,強烈不推薦使用EntityUtils這個類,除非目標服務器發(fā)出的響應是可信任
的该面,并且http響應實體的長度不會過大
夭苗。
有些情況下吆倦,我們希望可以重復讀取
Http實體的內容听诸。這就需要把Http實體內容緩存在內存或者磁盤上蚕泽。最簡單的方法就是把Http Entity轉化成BufferedHttpEntity
晌梨,這樣就把原Http實體的內容緩沖到了內存中。后面我們就可以重復讀取BufferedHttpEntity中的內容须妻。
CloseableHttpResponse response = <...>
HttpEntity entity = response.getEntity();
if (entity != null) {
entity = new BufferedHttpEntity(entity);
}
借鑒:HttpClient 4.3教程
入門結束,下一節(jié)記錄【為GET和POST請求添加
請求參數(shù)
和請求頭
】