疑惑的地方
剛開始接觸httpclient的同學(xué)可能會比較疑惑,因?yàn)槟惆l(fā)現(xiàn)創(chuàng)建httpclient的方式有兩種:
HttpClient client = new HttpClient();
CloseableHttpClient httpclient = HttpClients.createDefault();
到底該使用那種方式來創(chuàng)建httpclient,或者使用httpclient 又該導(dǎo)入哪些包。標(biāo)號1中,是commons-httpclient 版本的創(chuàng)建方式,標(biāo)號2是 httpclient的版本。這兩個版本都可以處理http請求。我查閱了一下apach的官網(wǎng)看到了這樣的一句話:
The Commons HttpClient project is now end of life, and is no longer being developed. It has been replaced by the Apache HttpComponents project in its HttpClient and HttpCore modules, which offer better performance and more flexibility.
大意是commons-httpclient項(xiàng)目不再提供更新和開發(fā)。看著這句話我們應(yīng)該明白了,以后HttpClient client = new HttpClient() 這種創(chuàng)建httpclient 的方式,也應(yīng)該會被我們棄用掉。新建的項(xiàng)目還是使用httpclient 吧。
之所以寫這篇文檔,也算是給自己做一個記錄吧,httpclient4.5的版本變化還是比較大的,網(wǎng)絡(luò)上的很多文檔都是基于4.4寫的,有點(diǎn)過時了。在學(xué)習(xí)官方文檔,教程,源碼的基礎(chǔ)上,給自己留下一個學(xué)習(xí)的小腳印。
序言
HTTP也許是當(dāng)今互聯(lián)網(wǎng)上使用的最重要的協(xié)議了,盡管java.net包提供了訪問HTTP資源的基本功能,但是因?yàn)樗牟粔蜢`活,使得Httpclient的應(yīng)用更加廣泛。HttpClient 不是一個瀏覽器,它是一個客戶端的HTTP通信實(shí)現(xiàn)庫,httpclient的目標(biāo)是發(fā)送和接收報文。
小Demo
提供一個小demo ,看看這個httpclient到底該怎么用。
- pom.xml文件中導(dǎo)入jar包
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
- demo 程序
import org.apache.http.Consts;
import org.apache.http.HttpStatus;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
/**
* describe
*
* @Author: soul
* @Date: 2016/12/5
* @since: JDK 1.8
* @Version: v1.0
*/
public class Demo {
public static void main(String[] args) throws IOException, URISyntaxException {
example();
}
public static void example() throws URISyntaxException, IOException {
//創(chuàng)建httpclient實(shí)例,采用默認(rèn)的參數(shù)配置
CloseableHttpClient httpClient = HttpClients.createDefault();
//通過URIBuilder類創(chuàng)建URI
URI uri = new URIBuilder().setScheme("http")
.setHost("www.baidu.com")
.build();
HttpGet get = new HttpGet(uri) ; //使用Get方法提交
//請求的參數(shù)配置,分別設(shè)置連接池獲取連接的超時時間,連接上服務(wù)器的時間,服務(wù)器返回?cái)?shù)據(jù)的時間
RequestConfig config = RequestConfig.custom()
.setConnectionRequestTimeout(3000)
.setConnectTimeout(3000)
.setSocketTimeout(3000)
.build();
//配置信息添加到Get請求中
get.setConfig(config);
//通過httpclient的execute提交 請求 ,并用CloseableHttpResponse接受返回信息
CloseableHttpResponse response = httpClient.execute(get);
//服務(wù)器返回的狀態(tài)
int statusCode = response.getStatusLine().getStatusCode() ;
//判斷返回的狀態(tài)碼是否是200 ,200 代表服務(wù)器響應(yīng)成功,并成功返回信息
if(statusCode == HttpStatus.SC_OK){
//EntityUtils 獲取返回的信息。官方不建議使用使用此類來處理信息
System.out.println("Demo.example -------->" + EntityUtils.toString(response.getEntity() , Consts.UTF_8));
}else {
System.out.println("Demo.example -------->" + "獲取信息失敗");
}
}
}
上面的程序基本上能滿足一些簡單的數(shù)據(jù)請求。總結(jié)下httpclient的使用步驟:
- 創(chuàng)建httpclient實(shí)例
- 創(chuàng)建httpmethod 方法實(shí)例 ,最常用的是HttpGet,HttpPost 類
- httpclient 通過execute方法提交Get 或者Post 請求
- 使用CloseableHttpResponse 來接受服務(wù)器返回的狀態(tài)信息和實(shí)體信息
- 關(guān)閉連接
HTTP 請求
所有的HTTP請求都有一個請求的起始行,由方法名,uri和HTTP協(xié)議版本組成 。
HttpClient很好的支持了HTTP/1.1規(guī)范中所有的HTTP方法:GET,HEAD,POST ,PUT ,DELETE ,TRACE 和 OPTIONS。每個方法都對應(yīng)一個類:HttpGet,HttpHead,HttpPost,HttpPut,HttpDelete,HttpTrace和HttpOptions。
uri->統(tǒng)一資源定位符,包含了協(xié)議名稱(http,https,ftp),主機(jī)名(www.xxx.com,www.xx.cn),可選端口(如果為80端口,可以省略),資源路徑(/search),可選參數(shù),可選片段等。
url如下:
http://www.google.com/search?hl=en&q=httpclient&btnG=Google+Search&aq=f&oq=
HttpClient提供了URIBuilder工具類來簡化創(chuàng)建。修改request URI .
URI uri = new URIBuilder().setScheme("http")
.setHost("www.google.com")
.setPath("/search")
.setParameter("q" ,"httpclient")
.setParamter("btnG" ,"google+Serach")
.build() ;
HttpGet get = new HttpGet(uri) ;
//除了使用URIBuilder工具類來創(chuàng)建連接,也可以直接采用字符串來定義uri
String url = http://www.google.com/search?hl=en&q=httpclient&btnG=Google+Search&aq=f&oq ;
HttpGet get = new HttpGet(url);
//效果也是一樣的
Http 響應(yīng)
HTTP響應(yīng)是服務(wù)器接收并解析請求信息后返回給客戶端的信息,它的起始行包含了一個協(xié)議版本,一個狀態(tài)和描述狀態(tài)的短語。Http/1.1 , 200 ,Ok
HTTP 實(shí)體
HttpClient 分為三種實(shí)體:
- 流式實(shí)體:內(nèi)容來源于一個流,或者在運(yùn)行中產(chǎn)生。流式實(shí)體不可重復(fù)。
- 自我包含:內(nèi)存中的內(nèi)容,通過獨(dú)立的鏈接/其他的實(shí)體獲得的內(nèi)容。自我包含實(shí)體可重復(fù)
- 包裝實(shí)體:從另外一個實(shí)體中獲得內(nèi)容。
服務(wù)器返回的信息封裝在了entity中,客戶端通過調(diào)用response.getEntity 可以拿到該實(shí)體內(nèi)容。通過HttpEntity#getContent()方法,可以將數(shù)據(jù)轉(zhuǎn)換成一個InputStream流。或者提供一個輸出流給HttpEntity#writeTo(Outputstream)方法,它將會返回寫入給定流的所有內(nèi)容。官方其實(shí)是不建議使用EntityUtils類的,除非響應(yīng)的實(shí)體來自于信任的Http服務(wù)器,并且知道它的長度。
釋放低級別的資源
為了確保正確的釋放資源,你必須關(guān)掉與實(shí)體相關(guān)的內(nèi)容流,還必須關(guān)掉響應(yīng)流。
- inputStrea.close()
- response.close()
參考: http://blog.csdn.net/u011179993/article/details/47123727
少年聽雨歌樓上,紅燭昏羅帳。
壯年聽雨客舟中,江闊云低,斷雁叫西風(fēng)。
感謝支持!
---起個名忒難