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

HTML表單

許多應(yīng)用需要模仿一個(gè)登陸HTML表單的過(guò)程,比如:為了登陸一個(gè)WEB應(yīng)用或者提交輸入的數(shù)據(jù)裁蚁。Httpclient 早就為我們準(zhǔn)備好了患久,提供了UrlEncodedFormEntity類來(lái)簡(jiǎn)化操作屎勘。
我們來(lái)看一下核心的代碼:

List<NameValuePair> list = new ArrayList<>() ;
list.add(new BasicNameValuePair("name" ,"zhangsan"));
list.add(new BasicNameValuePair("age" ,"18"));
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(list ,Consts.UTF_8) ;

post方法提交demo

import org.apache.http.Consts;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by YuLuo on 2016/12/5.
 */
public class PostDemo {
    public static void main(String[] args) throws IOException {
        demo();
    }
    public static void demo() throws IOException {
        //創(chuàng)建httpclient 實(shí)例
        CloseableHttpClient httpclient = HttpClients.createDefault();
        //創(chuàng)建post方法實(shí)例
        HttpPost post = new HttpPost("http://host/.com") ;

        //封裝提交到服務(wù)器的參數(shù)信息
        List<NameValuePair> list = new ArrayList<>() ;
        list.add(new BasicNameValuePair("name" ,"zhangsan"));
        list.add(new BasicNameValuePair("age" ,"18"));
        UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(list , Consts.UTF_8) ;
        //設(shè)置參數(shù)信息
        post.setEntity(formEntity);
        //提交post方法
        CloseableHttpResponse respone = httpclient.execute(post);

        int statcode = respone.getStatusLine().getStatusCode() ;
        if(statcode == HttpStatus.SC_OK){
            System.out.println(EntityUtils.toString(respone.getEntity()));
        }
    }

}

**解析NameValuePair **
通過(guò)查看源碼,發(fā)現(xiàn)NameValuePair只有兩個(gè)方法:

  1. getName()
  2. getValue()

BasicNameValuePair作為NameValuePair的實(shí)現(xiàn)類仲吏,只有兩個(gè)字段,Name和Value 蝌焚,并且它還實(shí)現(xiàn)了Cloneable 裹唆,Serializable 兩個(gè)接口。BasicNameValuePair 沒有提供屬性的setter方法综看。只能通過(guò)構(gòu)造方法品腹,為字段賦值。

內(nèi)容分塊

通過(guò)HTTP#setChunded()方法來(lái)通知HttpClient你要進(jìn)行分塊處理红碑, 由Httpclient根據(jù)被傳輸?shù)膱?bào)文屬性選擇最合適的傳輸編碼方式舞吭。當(dāng)使用一些不支持分塊的版本(http /1.0)時(shí),這個(gè)值會(huì)被忽略掉析珊。

Http執(zhí)行上下文 context

最初羡鸥,HTTP是被設(shè)計(jì)成無(wú)狀態(tài)的,面向請(qǐng)求-響應(yīng)協(xié)議忠寻。然而惧浴,我們?cè)谑褂玫倪^(guò)程中,經(jīng)常需要一些邏輯相關(guān)的請(qǐng)求-響應(yīng)交換來(lái)保持狀態(tài)信息奕剃。為了使應(yīng)用程序能夠維持一個(gè)過(guò)程狀態(tài)衷旅,httpclient允許HTTP請(qǐng)求在一個(gè)特定的執(zhí)行上下文中來(lái)執(zhí)行--稱為HTTP上下文。

HttpContext能夠包含任意的對(duì)象纵朋,因此在兩個(gè)不同的線程中共享上下文是不安全的柿顶。建議每個(gè)線程都有一個(gè)自己的上下文。

在HTTP請(qǐng)求執(zhí)行的過(guò)程中操软,HttpClient添加了下列屬性到執(zhí)行上下文中:

  • HttpConnection 實(shí)例代表連接到目標(biāo)服務(wù)器的當(dāng)前連接
  • HttpHost 實(shí)例代表連接到目標(biāo)服務(wù)器的當(dāng)前連接
  • HttpRoute 實(shí)例代表了完整的連接路由
  • HttpRequest 實(shí)例代表了當(dāng)前的HTTP請(qǐng)求嘁锯。
  • HttpResponse 實(shí)例代表了當(dāng)前的HTTP響應(yīng)。
  • RequestConfig 代表當(dāng)前請(qǐng)求配置。
  • java.util.List<URI> 對(duì)象代表一個(gè)含有執(zhí)行請(qǐng)求過(guò)程中所有重定向的地址家乘。

小demo
請(qǐng)求配置在最初被初始化蝗羊,它將在執(zhí)行上下文中一直保持,共享同一個(gè)會(huì)話的所有連續(xù)請(qǐng)求

 public static void contextDemo() throws IOException {
        CloseableHttpClient httpclient = HttpClients.createDefault();
        RequestConfig config = RequestConfig
                                        .custom()
                                        .setConnectionRequestTimeout(3000)
                                        .setConnectTimeout(3000)
                                        .setSocketTimeout(3000)
                                        .build();
        HttpGet get = new HttpGet("http://www.baidu.com");
        get.setConfig(config);
        HttpClientContext context = HttpClientContext.create();
        CloseableHttpResponse response = httpclient.execute(get, context);
        System.out.println(EntityUtils.toString(response.getEntity()));
        System.out.println("---------------------------------");
        HttpGet get1 = new HttpGet("http://www.qq.com");
        get1.setConfig(config);
        CloseableHttpResponse res = httpclient.execute(get1, context);
        System.out.println(EntityUtils.toString(res.getEntity()));
    }

異常處理
HttpClient 能夠拋出兩種類型的異常:

  1. java.io.IOException ,如socket 連接超時(shí)或被重置的異常仁锯。
  2. HttpException :標(biāo)志Http請(qǐng)求失敗的信號(hào)耀找,如違反HTTP協(xié)議。

I/O 錯(cuò)誤被認(rèn)為是非致命的和可以恢復(fù)的扑馁,而HTTP協(xié)議錯(cuò)誤涯呻,則被認(rèn)為是致命的而且是不能自動(dòng)恢復(fù)的。

請(qǐng)求嘗試處理器

為了能使用自定義異常的回復(fù)機(jī)制腻要,必須要實(shí)現(xiàn)HttpRequestRetryHandler接口复罐。

小demo

public static void requestRetryDemo() throws IOException {
        CloseableHttpClient httpClient = HttpClients
                .custom()
                .setRetryHandler(DefaultHttpRequestRetryHandler.INSTANCE)
                .build();
        HttpGet get = new HttpGet("http://www.baidu.com") ;
        CloseableHttpResponse response = httpClient.execute(get);
        System.out.println(EntityUtils.toString(response.getEntity()));
    }

上例中我們使用了默認(rèn)的請(qǐng)求重試類,默認(rèn)重試次數(shù)為三次雄家,requestSentRetryEnabled 為false效诅,當(dāng)然我們也可以自己定制,具體的參數(shù)請(qǐng)自行查閱源碼

請(qǐng)求終止

使用HttpRequest#abort()來(lái)終止線程 ;該方法為線程安全的,可以從任意線程調(diào)用趟济。

重定向處理

重定向的url,通過(guò)HttpContext#getRedirectLocation().獲取重定向網(wǎng)址乱投。

參考: http://blog.csdn.net/u011179993/article/details/47123727


少年聽雨歌樓上,紅燭昏羅帳顷编。  
壯年聽雨客舟中戚炫,江闊云低,斷雁叫西風(fēng)媳纬。
感謝支持双肤!
                                        ---起個(gè)名忒難

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市钮惠,隨后出現(xiàn)的幾起案子茅糜,更是在濱河造成了極大的恐慌,老刑警劉巖素挽,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔑赘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡预明,警方通過(guò)查閱死者的電腦和手機(jī)缩赛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)撰糠,“玉大人峦筒,你說(shuō)我怎么就攤上這事〈吧鳎” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)遮斥。 經(jīng)常有香客問(wèn)我峦失,道長(zhǎng),這世上最難降的妖魔是什么术吗? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任尉辑,我火速辦了婚禮,結(jié)果婚禮上较屿,老公的妹妹穿的比我還像新娘隧魄。我一直安慰自己,他們只是感情好隘蝎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布购啄。 她就那樣靜靜地躺著,像睡著了一般嘱么。 火紅的嫁衣襯著肌膚如雪狮含。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天曼振,我揣著相機(jī)與錄音几迄,去河邊找鬼。 笑死冰评,一個(gè)胖子當(dāng)著我的面吹牛映胁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播甲雅,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼解孙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了务荆?” 一聲冷哼從身側(cè)響起妆距,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎函匕,沒想到半個(gè)月后娱据,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盅惜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年中剩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抒寂。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡结啼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出屈芜,到底是詐尸還是另有隱情郊愧,我是刑警寧澤朴译,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站属铁,受9級(jí)特大地震影響眠寿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜焦蘑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一盯拱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧例嘱,春花似錦狡逢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至间学,卻和暖如春添吗,著一層夾襖步出監(jiān)牢的瞬間娜膘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卵蛉,地道東北人拘悦。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓锋爪,卻偏偏與公主長(zhǎng)得像婆翔,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子善涨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理窒盐,服務(wù)發(fā)現(xiàn),斷路器钢拧,智...
    卡卡羅2017閱讀 134,651評(píng)論 18 139
  • 連接管理 兩個(gè)主機(jī)之間建立的過(guò)程是很復(fù)雜的蟹漓,包括了兩個(gè)終端之間許多數(shù)據(jù)包的交換,會(huì)消耗掉大量的時(shí)間源内。對(duì)于很小的HT...
    起個(gè)名忒難閱讀 2,395評(píng)論 0 10
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,071評(píng)論 25 707
  • 周末在家看電視葡粒,隨意調(diào)換電臺(tái),眼前出現(xiàn)的身材火爆膜钓、顏值爆表嗽交、小麥色皮膚的辣媽吸引了我的眼球,她的游泳池是長(zhǎng)...
    田田寶貝閱讀 311評(píng)論 0 0
  • 天人之戀觸犯禁忌颂斜,一家三口墮入太牢夫壁。 無(wú)極生太極,太極生兩儀沃疮,兩儀生四象盒让,四象生八卦梅肤,八卦生天地,是為造化神器邑茄。輕...
    木易國(guó)強(qiáng)閱讀 892評(píng)論 2 7