httpclient 4.5.2 學(xué)習(xí)隨筆(1)

疑惑的地方

剛開始接觸httpclient的同學(xué)可能會比較疑惑,因?yàn)槟惆l(fā)現(xiàn)創(chuàng)建httpclient的方式有兩種:

  1. HttpClient client = new HttpClient();
  2. 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到底該怎么用。

  1. pom.xml文件中導(dǎo)入jar包
<dependency>
   <groupId>org.apache.httpcomponents</groupId>
   <artifactId>httpclient</artifactId>
   <version>4.5.2</version>
</dependency>
  1. 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í)體:

  1. 流式實(shí)體:內(nèi)容來源于一個流,或者在運(yùn)行中產(chǎn)生。流式實(shí)體不可重復(fù)。
  2. 自我包含:內(nèi)存中的內(nèi)容,通過獨(dú)立的鏈接/其他的實(shí)體獲得的內(nèi)容。自我包含實(shí)體可重復(fù)
  3. 包裝實(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)。
感謝支持!
                                        ---起個名忒難

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,763評論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,238評論 3 428
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,823評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,604評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,339評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,713評論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,712評論 3 445
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,893評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,448評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,201評論 3 357
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,397評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,944評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,631評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,033評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,321評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,128評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,347評論 2 377

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,818評論 18 139
  • apache下的httpclient工具可大大簡化開發(fā)過程中的點(diǎn)對點(diǎn)通信,本人將以微信多媒體接口為例,展示http...
    劃破的天空閱讀 5,320評論 0 32
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,912評論 6 342
  • 夢到了木頭,夢里還是跟原來一樣,我們很恩愛,接著他就從我身邊消失了,當(dāng)我尋找他時,我看到了J,他抱著籃球在前面等我...
    b10b01c7584e閱讀 224評論 0 0
  • 要進(jìn)行iOS開發(fā),肯定會遇到真機(jī)測試以及上線AppStore的問題,下面就簡單介紹一下證書以及配置文件的使用...
    呵呵哈哈24閱讀 659評論 0 1