這篇文章是這個系列的開篇,做爲移動開發者,開發的應用難免會對網絡進行訪問,雖然如今已經有不少的開源庫幫助咱們能夠垂手可得的訪問網絡,可是咱們仍要去了解網絡訪問的原理,這也是一個優秀開發人員所必備的知識點。這篇文章咱們就先來了解一下HTTP協議原理。html
HTTP是一個屬於應用層的面向對象的協議,因爲其簡捷、快速的方式,適用於分佈式超媒體信息系統。它於1990年提出,通過幾年的使用與發展,獲得不斷地完善和擴展。android
http://host[":"port][abs_path]
http表示要經過HTTP協議來定位網絡資源;host表示合法的Internet主機域名或者IP地址;port指定一個端口號,爲空則使用默認端口80;abs_path指定請求資源的URI(Web上任意的可用資源)。
HTTP有兩種報文分別是請求報文和響應報文,讓咱們先來看看請求報文。nginx
先來看看請求報文的通常格式:
web
一般來講一個HTTP請求報文由請求行、請求報頭、空行、和請求數據4個部分組成。api
請求行由請求方法,URL字段和HTTP協議的版本組成,格式以下:瀏覽器
Method Request-URI HTTP-Version CRLF
其中 Method表示請求方法;Request-URI是一個統一資源標識符;HTTP-Version表示請求的HTTP協議版本;CRLF表示回車和換行(除了做爲結尾的CRLF外,不容許出現單獨的CR或LF字符)。緩存
HTTP請求方法有8種,分別是GET、POST、DELETE、PUT、HEAD、TRACE、CONNECT 、OPTIONS。其中PUT、DELETE、POST、GET分別對應着增刪改查,對於移動開發最經常使用的就是POST和GET了。服務器
例如我去訪問個人CSDN博客地址請求行是:網絡
GET http://blog.csdn.net/itachi85 HTTP/1.1
在請求行以後會有0個或者多個請求報頭,每一個請求報頭都包含一個名字和一個值,它們之間用「:」分割。請求頭部會以一個空行,發送回車符和換行符,通知服務器如下不會有請求頭。關於請求報頭,會在後面的消息報頭一節作統一的解釋。session
請求數據不在GET方法中使用,而是在POST方法中使用。POST方法適用於須要客戶填寫表單的場合,與請求數據相關的最經常使用的請求頭是Content-Type和Content-Length。
先來看看響應報文的通常格式:
HTTP的響應報文由狀態行、消息報頭、空行、響應正文組成。響應報頭後面會講到,響應正文是服務器返回的資源的內容,先來看看狀態行。
一、狀態行格式以下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示服務器HTTP協議的版本;Status-Code表示服務器發回的響應狀態代碼;Reason-Phrase表示狀態代碼的文本描述。
狀態代碼有三位數字組成,第一個數字定義了響應的類別,且有五種可能取值:
常見的狀態碼以下:
例如訪問個人CSDN博客地址響應的狀態行是:
HTTP/1.1 200 OK
消息報頭分爲通用報頭、請求報頭、響應報頭、實體報頭等。消息頭由鍵值對組成,每行一對,關鍵字和值用英文冒號「:"分隔。
既能夠出如今請求報頭,也能夠出如今響應報頭中
請求報頭通知服務器關於客戶端求求的信息,典型的請求頭有:
用於服務器傳遞自身信息的響應,常見的響應報頭:
實體報頭用來定於被傳送資源的信息,既能夠用於請求也可用於響應。請求和響應消息均可以傳送一個實體,常見的實體報頭爲:
要想查看網頁或者手機請求網絡的請求報文和響應報文有不少種方法,這裏推薦採用Fiddler,在Android利用Fiddler進行網絡數據抓包這篇文章中詳盡介紹瞭如何使用Fiddler,在這裏就不贅述了。
打開Fiddler,而後用瀏覽器訪問個人CSDN博客網站:
點擊紅色畫筆的區域就能夠看到請求報文和響應報文了
請求報文:
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方法因此並無請求數據。
響應報文:
HTTP/1.1 200 OK //狀態行 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 }ysI 1ߡFsgl n- ]{^_ { 'z! C , m# 0 !l ` 4x ly .ݪ* ڴzAt_Xl * 9'O ɬ ' ק 3 ^1a ...省略
響應報文沒什麼可說的,接下來咱們配置好手機網絡代理,訪問一個應用的界面
請求報文:
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 //不能省略的空格,下面是請求數據 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 //狀態行 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因此顯示在這裏的響應數據是亂碼 mP N @ "E ? n m 1 w ( HL (1^ P nK E ѷ93'3gNLH 7P $c \ T 4a6 L:+ 1dY%$g h H + ...省略
響應報文的實體採用的編碼格式爲爲gzip,因此在Fiddler軟件中顯示的是亂碼。