文加圖, 理解Http請(qǐng)求與響應(yīng)

文加圖, 理解Http請(qǐng)求與響應(yīng)

標(biāo)簽 : 網(wǎng)絡(luò)

作者 : 王乾

時(shí)間 : 2016.08.01

blog : http://blog.csdn.net/oncealong


1. http請(qǐng)求和響應(yīng)步驟

在講解OkHttp之前, 我們首先來個(gè)高清大圖, 看下http請(qǐng)求的整個(gè)步驟, 有個(gè)整體概念.

2. http每一步詳細(xì)內(nèi)容

在一次完整的HTTP通信過程中, Web瀏覽器與Web服務(wù)器之間將完成下列7個(gè)步驟:

2.1 建立TCP連接

在HTTP工作開始之前, Web瀏覽器首先要通過網(wǎng)絡(luò)與Web服務(wù)器建立連接, 該連接是通過TCP來完成的, 該協(xié)議與IP協(xié)議共同構(gòu)建Internet, 即著名的TCP/IP協(xié)議族, 因此Internet又被稱作是TCP/IP網(wǎng)絡(luò).

HTTP是比TCP更高層次的應(yīng)用層協(xié)議, 根據(jù)規(guī)則, 只有低層協(xié)議建立之后才能進(jìn)行更高層協(xié)議的連接, 因此, 首先要建立TCP連接, 一般TCP連接的端口號(hào)是80.

TCP連接中我們比較熟悉的就是三次握手, 但是為什么是三次而不是兩次或四次呢? 這里我想到了一個(gè)比喻來讓大家明白.


敵人封鎖江面, 我方間諜和聯(lián)絡(luò)員只能通過電報(bào)機(jī)隔著江面交流. 但是那時(shí)的電報(bào)機(jī)質(zhì)量不穩(wěn)定, 有可能會(huì)出現(xiàn)失靈的情況. 所以就出現(xiàn)了如下對(duì)話:

間諜: 聯(lián)絡(luò)員, 你能收到我發(fā)的話么? 你要是能收到, 就說明我這個(gè)電報(bào)機(jī)可以發(fā)電報(bào).

聯(lián)絡(luò)員: 間諜, 我收到你發(fā)的話了, 這說明我的電報(bào)機(jī)可以收. 但是我不確定我的電報(bào)機(jī)能不能發(fā), 你能收到我發(fā)的這句話么? 你要是能收到, 就說明我的電報(bào)機(jī)是可以發(fā)電報(bào)的.

間諜: 聯(lián)絡(luò)員, 我收到你的話了. 我的電報(bào)機(jī)也是能發(fā)能收, 我們可以正式交流情報(bào)了.

這個(gè)故事代表了tcp的三次握手, 確定了client和server的發(fā)送和接收功能都正常. 如果只發(fā)送兩次, 那么不能確定client和server都能正常收發(fā); 如果發(fā)送四次或者更多, 理論上當(dāng)然也是可以的, 但是網(wǎng)絡(luò)環(huán)境十分復(fù)雜, 任何兩次請(qǐng)求間都可能出現(xiàn)錯(cuò)誤, 多出的請(qǐng)求次數(shù)并無法確保下一個(gè)請(qǐng)求一定安全.

希望通過這個(gè)故事讓大家明白為什么會(huì)有tcp三次握手.

2.2 Web瀏覽器向Web服務(wù)器發(fā)送請(qǐng)求命令

一旦建立了TCP連接, Web瀏覽器就會(huì)向Web服務(wù)器發(fā)送請(qǐng)求命令

例如:GET/sample/hello.jsp HTTP/1.1

2.3 Web瀏覽器發(fā)送請(qǐng)求頭信息

瀏覽器發(fā)送其請(qǐng)求命令之后, 還要以頭信息的形式向Web服務(wù)器發(fā)送一些別的信息, 這些信息用來描述瀏覽器自己. 之后瀏覽器發(fā)送了一空白行來通知服務(wù)器, 表示它已經(jīng)結(jié)束了該頭信息的發(fā)送. 若是post請(qǐng)求, 還會(huì)在發(fā)送完請(qǐng)求頭信息之后發(fā)送請(qǐng)求體.

2.4 Web服務(wù)器應(yīng)答

客戶機(jī)向服務(wù)器發(fā)出請(qǐng)求后, 服務(wù)器會(huì)向客戶機(jī)回送應(yīng)答.

HTTP/1.1 200 OK

應(yīng)答的第一部分是協(xié)議的版本號(hào)和應(yīng)答狀態(tài)碼

2.5 Web服務(wù)器發(fā)送應(yīng)答頭信息

正如客戶端會(huì)隨同請(qǐng)求發(fā)送關(guān)于自身的信息一樣,服務(wù)器也會(huì)隨同應(yīng)答向用戶發(fā)送關(guān)于它自己的數(shù)據(jù)及被請(qǐng)求的文檔. 最后以一個(gè)空白行來表示頭信息發(fā)送到此結(jié)束.

2.6 Web服務(wù)器向?yàn)g覽器發(fā)送數(shù)據(jù)

Web服務(wù)器向?yàn)g覽器發(fā)送頭信息后, 它就以Content-Type應(yīng)答頭信息所描述的格式發(fā)送用戶所請(qǐng)求的實(shí)際數(shù)據(jù)

2.7 Web服務(wù)器關(guān)閉TCP連接

一般情況下, 一旦Web服務(wù)器向?yàn)g覽器發(fā)送了請(qǐng)求數(shù)據(jù), 它就要關(guān)閉TCP連接. 如果瀏覽器或者服務(wù)器在其頭信息加入了這行代碼

Connection:keep-alive

TCP連接在發(fā)送后將仍然保持打開狀態(tài). 于是, 瀏覽器可以繼續(xù)通過相同的連接發(fā)送請(qǐng)求. 保持連接節(jié)省了為每個(gè)請(qǐng)求建立新連接所需的時(shí)間, 還節(jié)約了網(wǎng)絡(luò)帶寬.

3. 使用fiddler抓包驗(yàn)證請(qǐng)求信息和響應(yīng)信息

這里, 給大家推薦一個(gè)抓包工具fiddler, 免費(fèi)好用. 而且可以在本機(jī)設(shè)置代理, 直接抓取同局域網(wǎng)的android或ios手機(jī)的數(shù)據(jù)包, 如果需要請(qǐng)谷歌fiddler android.

這里我們安裝fiddler后, 打開composer, composer可以直接構(gòu)建http請(qǐng)求并執(zhí)行.

3.1 get的請(qǐng)求和應(yīng)答

我們首先構(gòu)建一個(gè)get請(qǐng)求, 設(shè)置如下:

可以看到, 我們需要設(shè)置請(qǐng)求方法, 請(qǐng)求地址, 請(qǐng)求協(xié)議請(qǐng)求頭.

點(diǎn)擊execute, 即可執(zhí)行我們的請(qǐng)求. 上圖左欄即是我們請(qǐng)求的結(jié)果, 點(diǎn)擊查看. 下圖就是我們http請(qǐng)求的raw數(shù)據(jù), raw代表沒有為了方便觀看而格式化的數(shù)據(jù).

接下來看下我們請(qǐng)求的應(yīng)答:

3.2 post的請(qǐng)求和應(yīng)答

post請(qǐng)求, 因?yàn)樯婕暗叫枰蟼鞯恼?qǐng)求體, 手頭沒有現(xiàn)成的服務(wù)器, 所以我們用ithome的登陸來舉例說明. 下圖是登陸時(shí)post的具體數(shù)據(jù):

我們分析下, 其請(qǐng)求方法為post, 請(qǐng)求地址為btnLogin_Click, 請(qǐng)求協(xié)議為HTTP/1.1. 然后是請(qǐng)求頭, 請(qǐng)求頭中有一個(gè)比較重要的設(shè)置是Content-Type: application/json; charset=utf-8. 表示我們會(huì)上傳一個(gè)json文件, json文件的格式是utf-8, 這里面保存的就是用戶名和密碼, 通過post請(qǐng)求在請(qǐng)求體中傳輸給服務(wù)器.

json文件具體內(nèi)容是:

這正驗(yàn)證了我們上文所說.

我們看下post請(qǐng)求的響應(yīng):

我們又看到了Content-Type: application/json; charset=gb2312, 這說明在響應(yīng)頭結(jié)束后, 會(huì)有一個(gè)gb2312編碼的json. 我們看下這個(gè)json的內(nèi)容:

看到我們的請(qǐng)求返回的內(nèi)容就是ok, 代表有這個(gè)用戶名和密碼正確.

4. 結(jié)語

希望通過這一節(jié), 讓大家對(duì)http協(xié)議有個(gè)整體上的認(rèn)識(shí), 清楚get和post請(qǐng)求和響應(yīng)的組成.

如果我們要寫一個(gè)庫來完成http協(xié)議的功能, 那么我們應(yīng)該需要控制 請(qǐng)求方法: get/post, 請(qǐng)求地址: url, 請(qǐng)求協(xié)議: http/1.1, 請(qǐng)求頭: 描述自身信息, 請(qǐng)求體: post時(shí)才有, 有了這些我們才能構(gòu)建一個(gè)http請(qǐng)求. 當(dāng)響應(yīng)時(shí), 我們應(yīng)該需要一些字段代表 應(yīng)答協(xié)議: http/1.1, 響應(yīng)碼: 200, 應(yīng)答頭: content-type等描述自身信息, 響應(yīng)體: 如json, html等, 這樣我們才能完全的表示我們的返回響應(yīng).

有了這些概念, 下一節(jié), 我們講解OkHttp將會(huì)特別輕松愉快. 因?yàn)镺kHttp完成的就是get或post請(qǐng)求, 所以O(shè)kHttp中就有類來代表我們剛才講到的 請(qǐng)求方法, 請(qǐng)求地址, 請(qǐng)求協(xié)議等概念, 了解了OkHttp中的這些類, 那么OkHttp你也就學(xué)會(huì)怎么使用了.

謝謝下列文章:

http://www.cnblogs.com/yin-jingyu/archive/2011/08/01/2123548.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蛉威,一起剝皮案震驚了整個(gè)濱河市斋否,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖丈氓,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異闯传,居然都是意外死亡峰髓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門完沪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來域庇,“玉大人,你說我怎么就攤上這事覆积√螅” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵宽档,是天一觀的道長尉姨。 經(jīng)常有香客問我,道長吗冤,這世上最難降的妖魔是什么又厉? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮椎瘟,結(jié)果婚禮上覆致,老公的妹妹穿的比我還像新娘。我一直安慰自己肺蔚,他們只是感情好煌妈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般璧诵。 火紅的嫁衣襯著肌膚如雪汰蜘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天腮猖,我揣著相機(jī)與錄音鉴扫,去河邊找鬼。 笑死澈缺,一個(gè)胖子當(dāng)著我的面吹牛坪创,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播姐赡,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼莱预,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了项滑?” 一聲冷哼從身側(cè)響起依沮,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎枪狂,沒想到半個(gè)月后危喉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡州疾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年辜限,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片严蓖。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡薄嫡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出颗胡,到底是詐尸還是另有隱情毫深,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布毒姨,位于F島的核電站哑蔫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏弧呐。R本人自食惡果不足惜鸳址,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泉懦。 院中可真熱鬧,春花似錦疹瘦、人聲如沸崩哩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽邓嘹。三九已至酣栈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間汹押,已是汗流浹背矿筝。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棚贾,地道東北人窖维。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像妙痹,于是被迫代替她去往敵國和親铸史。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

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

  • 一怯伊、概念(載錄于:http://www.cnblogs.com/EricaMIN1987_IT/p/3837436...
    yuantao123434閱讀 8,348評(píng)論 6 152
  • Http協(xié)議詳解 標(biāo)簽(空格分隔): Linux 聲明:本片文章非原創(chuàng)琳轿,內(nèi)容來源于博客園作者M(jìn)IN飛翔的HTTP協(xié)...
    Sivin閱讀 5,222評(píng)論 3 82
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)耿芹,斷路器崭篡,智...
    卡卡羅2017閱讀 134,651評(píng)論 18 139
  • HTTP概述 超文本傳輸協(xié)議(HTTP,HyperText Transfer Protocol) 是互聯(lián)網(wǎng)上應(yīng)用最...
    曹淵說創(chuàng)業(yè)閱讀 3,849評(píng)論 2 61
  • 生活好像過得并不算特別如意 自從畢業(yè)之后吧秕,曾經(jīng)的想法與激情如同退潮的海水一樣漸漸走遠(yuǎn)琉闪,雖說時(shí)刻提醒自己不要被不...
    Loke307閱讀 296評(píng)論 0 0