Android網(wǎng)絡編程(一)HTTP協(xié)議原理

前言

這篇文章是這個系列的開篇赌髓,作為移動開發(fā)者蚓庭,開發(fā)的應用不免會對網(wǎng)絡進行訪問猪瞬,雖然現(xiàn)在已經(jīng)有很多的開源庫幫助我們可以輕而易舉的訪問網(wǎng)絡,但是我們?nèi)砸チ私饩W(wǎng)絡訪問的原理富岳,這也是一個優(yōu)秀開發(fā)人員所必備的知識點蛔糯。這篇文章我們就先來了解一下HTTP協(xié)議原理。

1.HTTP簡介

HTTP是一個屬于應用層的面向?qū)ο蟮膮f(xié)議窖式,由于其簡捷蚁飒、快速的方式,適用于分布式超媒體信息系統(tǒng)萝喘。它于1990年提出淮逻,經(jīng)過幾年的使用與發(fā)展琼懊,得到不斷地完善和擴展。

HTTP協(xié)議的主要特點

  1. 支持C/S(客戶/服務器)模式爬早。
  2. 簡單快速:客戶向服務器請求服務時哼丈,只需傳送請求方法和路徑。請求方法常用的有GET筛严、HEAD醉旦、POST,每種方法規(guī)定了客戶與服務器聯(lián)系的類型不同桨啃。由于HTTP協(xié)議簡單车胡,使得HTTP服務器的程序規(guī)模小,因而通信速度很快照瘾。
  3. 靈活:HTTP允許傳輸任意類型的數(shù)據(jù)對象匈棘。正在傳輸?shù)念愋陀蒀ontent-Type加以標記。
  4. 無連接:無連接的含義是限制每次連接只處理一個請求析命。服務器處理完客戶的請求主卫,并收到客戶的應答后,即斷開連接鹃愤。采用這種方式可以節(jié)省傳輸時間队秩。
  5. 無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議,無狀態(tài)是指協(xié)議對于事務處理沒有記憶能力昼浦。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳筒主,這樣可能導致每次連接傳送的數(shù)據(jù)量增大关噪。另一方面,在服務器不需要先前信息時它的應答就較快乌妙。

HTTP URL 的格式如下

http://host[":"port][abs_path]

http表示要通過HTTP協(xié)議來定位網(wǎng)絡資源使兔;host表示合法的Internet主機域名或者IP地址;port指定一個端口號藤韵,為空則使用默認端口80虐沥;abs_path指定請求資源的URI(Web上任意的可用資源)。
HTTP有兩種報文分別是請求報文和響應報文泽艘,讓我們先來看看請求報文欲险。

2.HTTP的請求報文

先來看看請求報文的一般格式:

這里寫圖片描述

通常來說一個HTTP請求報文由請求行、請求報頭匹涮、空行天试、和請求數(shù)據(jù)4個部分組成。

請求行

請求行由請求方法然低,URL字段和HTTP協(xié)議的版本組成喜每,格式如下:

Method Request-URI HTTP-Version CRLF

其中 Method表示請求方法务唐;Request-URI是一個統(tǒng)一資源標識符;HTTP-Version表示請求的HTTP協(xié)議版本带兜;CRLF表示回車和換行(除了作為結尾的CRLF外枫笛,不允許出現(xiàn)單獨的CR或LF字符)。

HTTP請求方法有8種刚照,分別是GET刑巧、POST、DELETE涩咖、PUT海诲、HEAD、TRACE檩互、CONNECT 特幔、OPTIONS。其中PUT闸昨、DELETE蚯斯、POST、GET分別對應著增刪改查饵较,對于移動開發(fā)最常用的就是POST和GET了拍嵌。

  1. GET:請求獲取Request-URI所標識的資源
  2. POST:在Request-URI所標識的資源后附加新的數(shù)據(jù)
  3. HEAD 請求獲取由Request-URI所標識的資源的響應消息報頭
  4. PUT 請求服務器存儲一個資源,并用Request-URI作為其標識
  5. DELETE 請求服務器刪除Request-URI所標識的資源
  6. TRACE 請求服務器回送收到的請求信息循诉,主要用于測試或診斷
  7. CONNECT 保留將來使用
  8. OPTIONS 請求查詢服務器的性能横辆,或者查詢與資源相關的選項和需求

例如我去訪問我的CSDN博客地址請求行是:

GET http://blog.csdn.net/itachi85 HTTP/1.1

請求報頭

在請求行之后會有0個或者多個請求報頭,每個請求報頭都包含一個名字和一個值茄猫,它們之間用“:”分割狈蚤。請求頭部會以一個空行,發(fā)送回車符和換行符划纽,通知服務器以下不會有請求頭脆侮。關于請求報頭,會在后面的消息報頭一節(jié)做統(tǒng)一的解釋勇劣。

請求數(shù)據(jù)

請求數(shù)據(jù)不在GET方法中使用靖避,而是在POST方法中使用。POST方法適用于需要客戶填寫表單的場合比默,與請求數(shù)據(jù)相關的最常用的請求頭是Content-Type和Content-Length幻捏。

3.HTTP的響應報文

先來看看響應報文的一般格式:


這里寫圖片描述

HTTP的響應報文由狀態(tài)行、消息報頭命咐、空行粘咖、響應正文組成。響應報頭后面會講到侈百,響應正文是服務器返回的資源的內(nèi)容瓮下,先來看看狀態(tài)行翰铡。

狀態(tài)行

1、狀態(tài)行格式如下:

HTTP-Version Status-Code Reason-Phrase CRLF

其中讽坏,HTTP-Version表示服務器HTTP協(xié)議的版本锭魔;Status-Code表示服務器發(fā)回的響應狀態(tài)代碼;Reason-Phrase表示狀態(tài)代碼的文本描述路呜。
狀態(tài)代碼有三位數(shù)字組成迷捧,第一個數(shù)字定義了響應的類別,且有五種可能取值:

  • 100~199:指示信息胀葱,表示請求已接收漠秋,繼續(xù)處理
  • 200~299:請求成功,表示請求已被成功接收抵屿、理解庆锦、接受
  • 300~399:重定向,要完成請求必須進行更進一步的操作
  • 400~499:客戶端錯誤轧葛,請求有語法錯誤或請求無法實現(xiàn)
  • 500~599:服務器端錯誤搂抒,服務器未能實現(xiàn)合法的請求

常見的狀態(tài)碼如下:

  • 200 OK:客戶端請求成功
  • 400 Bad Request:客戶端請求有語法錯誤,不能被服務器所理解
  • 401 Unauthorized:請求未經(jīng)授權尿扯,這個狀態(tài)代碼必須和WWW-Authenticate報頭域一起使用
  • 403 Forbidden:服務器收到請求求晶,但是拒絕提供服務
  • 500 Internal Server Error:服務器發(fā)生不可預期的錯誤
  • 503 Server Unavailable:服務器當前不能處理客戶端的請求,一段時間后可能恢復正常

例如訪問我的CSDN博客地址響應的狀態(tài)行是:

HTTP/1.1 200 OK

4.HTTP的消息報頭

消息報頭分為通用報頭衷笋、請求報頭芳杏、響應報頭、實體報頭等辟宗。消息頭由鍵值對組成蚜锨,每行一對,關鍵字和值用英文冒號“:"分隔慢蜓。

通用報頭

既可以出現(xiàn)在請求報頭,也可以出現(xiàn)在響應報頭中

  • Date:表示消息產(chǎn)生的日期和時間
  • Connection:允許發(fā)送指定連接的選項郭膛,例如指定連接是連續(xù)的晨抡,或者指定“close”選項,通知服務器则剃,在響應完成后耘柱,關閉連接
  • Cache-Control:用于指定緩存指令,緩存指令是單向的(響應中出現(xiàn)的緩存指令在請求中未必會出現(xiàn))棍现,且是獨立的(一個消息的緩存指令不會影響另一個消息處理的緩存機制)

請求報頭

請求報頭通知服務器關于客戶端求求的信息调煎,典型的請求頭有:

  • Host:請求的主機名,允許多個域名同處一個IP地址己肮,即虛擬主機
  • User-Agent:發(fā)送請求的瀏覽器類型士袄、操作系統(tǒng)等信息
  • Accept:客戶端可識別的內(nèi)容類型列表悲关,用于指定客戶端接收那些類型的信息
  • Accept-Encoding:客戶端可識別的數(shù)據(jù)編碼
  • Accept-Language:表示瀏覽器所支持的語言類型
  • Connection:允許客戶端和服務器指定與請求/響應連接有關的選項,例如這是為Keep-Alive則表示保持連接娄柳。
  • Transfer-Encoding:告知接收端為了保證報文的可靠傳輸寓辱,對報文采用了什么編碼方式。

響應報頭

用于服務器傳遞自身信息的響應赤拒,常見的響應報頭:

  • Location:用于重定向接受者到一個新的位置秫筏,常用在更換域名的時候
  • Server:包含可服務器用來處理請求的系統(tǒng)信息,與User-Agent請求報頭是相對應的

實體報頭

實體報頭用來定于被傳送資源的信息挎挖,既可以用于請求也可用于響應这敬。請求和響應消息都可以傳送一個實體,常見的實體報頭為:

  • Content-Type:發(fā)送給接收者的實體正文的媒體類型
  • Content-Lenght:實體正文的長度
  • Content-Language:描述資源所用的自然語言蕉朵,沒有設置則該選項則認為實體內(nèi)容將提供給所有的語言閱讀
  • Content-Encoding:實體報頭被用作媒體類型的修飾符崔涂,它的值指示了已經(jīng)被應用到實體正文的附加內(nèi)容的編碼,因而要獲得Content-Type報頭域中所引用的媒體類型墓造,必須采用相應的解碼機制堪伍。
  • Last-Modified:實體報頭用于指示資源的最后修改日期和時間
  • Expires:實體報頭給出響應過期的日期和時間

5.應用舉例

要想查看網(wǎng)頁或者手機請求網(wǎng)絡的請求報文和響應報文有很多種方法,這里推薦采用Fiddler觅闽,在Android利用Fiddler進行網(wǎng)絡數(shù)據(jù)抓包這篇文章中詳盡介紹了如何使用Fiddler帝雇,在這里就不贅述了。
打開Fiddler蛉拙,然后用瀏覽器訪問我的CSDN博客網(wǎng)站:

這里寫圖片描述

點擊紅色畫筆的區(qū)域就可以看到請求報文和響應報文了

請求報文:

GET http://blog.csdn.net/itachi85 HTTP/1.1                                //請求行
Host: blog.csdn.net                                                       //請求報頭
Connection: keep-alive
Cache-Control: max-age=0       
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36 QQBrowser/9.3.6872.400
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
Cookie: bdshare_firstime=1443768140949; uuid_tt_dd=5028529250430960147_20151002;
...省略


很容易看出訪問的是我的博客地址http://blog.csdn.net/itachi85尸闸,請求的方法是GET,因為是GET方法所以并沒有請求數(shù)據(jù)孕锄。

響應報文:

HTTP/1.1 200 OK                                                         //狀態(tài)行
Server: openresty                                                       //響應報頭
Date: Sun, 27 Mar 2016 08:26:54 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=20
Vary: Accept-Encoding
Cache-Control: private
X-Powered-By: PHP 5.4.28
Content-Encoding: gzip
                                                                        //不能省略的空格
28b5                                    
? ?      ? }ys?I   ?1?Fsgl n- ]?{^_ { 'z!?     C ,  ?m# 0 ?!?l  ?? `  4x  ly .?*  
  ?zA?t_Xl *  9'O  ?  '?  ?   3  ^1?a
...省略  

響應報文沒什么可說的吮廉,接下來我們配置好手機網(wǎng)絡代理,訪問一個應用的界面

請求報文:

POST http://patientapi.shoujikanbing.com/api/common/getVersion HTTP/1.1       //請求行
Content-Length: 226                                                          //請求報頭
Content-Type: application/x-www-form-urlencoded
Host: patientapi.shoujikanbing.com
Connection: Keep-Alive
User-Agent: Mozilla/5.0 (Linux; U; Android 4.4.4; zh-cn; MI NOTE LTE Build/KTU84P) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
Accept-Encoding: gzip
                                                             //不能省略的空格畸肆,下面是請求數(shù)據(jù)
clientversion=2_2.0.0&time=1459069342&appId=android&channel=hjwang&sessionId=0d1cee1f31926ffa8894c64804efa855101d56eb21caf5db5dcb9a4955b7fbc9&token=b191944d680145b5ed97f2f4ccf03058&deviceId=869436020220717&type=2&version=2.0.0

從請求報文的請求行來看宦芦,請求的方法是POST,請求地址為http://patientapi.shoujikanbing.com/api/common/getVersion轴脐,很顯然是獲取版本信息的接口调卑。

響應報文:

HTTP/1.1 200 OK                                                              //狀態(tài)行
Server: nginx                                                               //響應報頭
Date: Sun, 27 Mar 2016 09:02:20 GMT
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Set-Cookie: sessionId=0d1cee1f31926ffa8894c64804efa855101d56eb21caf5db5dcb9a4955b7fbc9; expires=Mon, 28-Mar-2016 09:02:20 GMT; Max-Age=86400; path=/; domain=.shoujikanbing.com
Set-Cookie: PHPSESSID=0d1cee1f31926ffa8894c64804efa855101d56eb21caf5db5dcb9a4955b7fbc9; path=/; domain=.shoujikanbing.com
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Encoding: gzip
                                                   //不能省略的空格
17f                                                //實體報文編碼格式為gzip所以顯示在這里的響應數(shù)據(jù)是亂碼
? ?      ?mP N @? ?    "E ? ?   n? m   ?1  
w ( HL (1?^ ?P? nK  E? ?93'3gN??LH  7?P  $?c \  T 4a6   L:+ 1?dY?%$g   h H   +

...省略

響應報文的實體采用的編碼格式為為gzip,所以在Fiddler軟件中顯示的是亂碼大咱。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恬涧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子碴巾,更是在濱河造成了極大的恐慌溯捆,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厦瓢,死亡現(xiàn)場離奇詭異提揍,居然都是意外死亡啤月,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門碳锈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來顽冶,“玉大人,你說我怎么就攤上這事售碳∏恐兀” “怎么了竖共?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵镊叁,是天一觀的道長。 經(jīng)常有香客問我偷霉,道長艺智,這世上最難降的妖魔是什么倘要? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮十拣,結果婚禮上封拧,老公的妹妹穿的比我還像新娘。我一直安慰自己夭问,他們只是感情好泽西,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缰趋,像睡著了一般捧杉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上秘血,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天味抖,我揣著相機與錄音,去河邊找鬼灰粮。 笑死仔涩,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的粘舟。 我是一名探鬼主播熔脂,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蓖乘!你這毒婦竟也來了?” 一聲冷哼從身側響起韧骗,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤嘉抒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后袍暴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體些侍,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡隶症,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了岗宣。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚂会。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖耗式,靈堂內(nèi)的尸體忽然破棺而出胁住,到底是詐尸還是另有隱情,我是刑警寧澤刊咳,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布彪见,位于F島的核電站,受9級特大地震影響娱挨,放射性物質(zhì)發(fā)生泄漏余指。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一跷坝、第九天 我趴在偏房一處隱蔽的房頂上張望酵镜。 院中可真熱鬧,春花似錦柴钻、人聲如沸淮韭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缸濒。三九已至,卻和暖如春粱腻,著一層夾襖步出監(jiān)牢的瞬間庇配,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工绍些, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留捞慌,地道東北人。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓柬批,卻偏偏與公主長得像啸澡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子氮帐,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

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