Android網路編程(一)HTTP協議原理

來源:互聯網
上載者:User

標籤:

前言

這篇文章是這個系列的開篇,作為移動開發人員,開發的應用不免會對網路進行訪問,雖然現在已經有很多的開源庫協助我們可以輕而易舉訪問網路,但是我們仍要去瞭解網路訪問的原理,這也是一個優秀開發人員所必備的知識點。這篇文章我們就先來瞭解一下HTTP協議原理。

1.HTTP簡介

HTTP是一個屬於應用程式層的物件導向的協議,由於其簡捷、快速的方式,適用於分布式超媒體資訊系統。它於1990年提出,經過幾年的使用與發展,得到不斷地完善和擴充。

HTTP協議的主要特點
  1. 支援C/S(客戶/伺服器)模式。
  2. 簡單快速:客戶向伺服器請求服務時,只需傳送要求方法和路徑。要求方法常用的有GET、HEAD、POST,每種方法規定了客戶與伺服器聯絡的類型不同。由於HTTP協議簡單,使得HTTP伺服器的程式規模小,因而通訊速度很快。
  3. 靈活:HTTP允許傳輸任意類型的資料對象。正在傳輸的類型由Content-Type加以標記。
  4. 無串連:不需連線的含義是限制每次串連只處理一個請求。伺服器處理完客戶的請求,並收到客戶的應答後,即中斷連線。採用這種方式可以節省傳輸時間。
  5. 無狀態:HTTP協議是無狀態協議,無狀態是指協議對於交易處理沒有記憶能力。缺少狀態意味著如果後續處理需要前面的資訊,則它必須重傳,這樣可能導致每次串連傳送的資料量增大。另一方面,在伺服器不需要先前資訊時它的應答就較快。
HTTP URL 的格式如下
http://host[":"port][abs_path]

http表示要通過HTTP協議來定位網路資源;host表示合法的Internet主機網域名稱或者IP地址;port指定一個連接埠號碼,為空白則使用預設連接埠80;abs_path指定請求資源的URI(Web上任意的可用資源)。
HTTP有兩種報文分別是請求報文和響應報文,讓我們先來看看請求報文。

2.HTTP的請求報文

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

通常來說一個HTTP請求報文由請求行、請求前序、空行、和請求資料4個部分組成。

請求行

請求行由要求方法,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了。

  1. GET:請求擷取Request-URI所標識的資源
  2. POST:在Request-URI所標識的資源後附加新的資料
  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個或者多個請求前序,每個請求前序都包含一個名字和一個值,它們之間用“:”分割。要求標頭部會以一個空行,發送斷行符號符和分行符號,通知伺服器以下不會有要求標頭。關於請求前序,會在後面的訊息前序一節做統一的解釋。

請求資料

請求資料不在GET方法中使用,而是在POST方法中使用。POST方法適用於需要客戶填寫表單的場合,與請求資料相關的最常用的要求標頭是Content-Type和Content-Length。

3.HTTP的響應報文

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

HTTP的響應報文由狀態行、訊息前序、空行、響應本文組成。響應前序後面會講到,響應本文是伺服器返回的資源的內容,先來看看狀態行。

狀態行

1、狀態行格式如下:

HTTP-Version Status-Code Reason-Phrase CRLF

其中,HTTP-Version表示伺服器HTTP協議的版本;Status-Code表示伺服器發回的響應狀態碼;Reason-Phrase表示狀態碼的文本描述。
狀態碼有三位元字組成,第一個數字定義了響應的類別,且有五種可能取值:

  • 100~199:指示資訊,表示請求已接收,繼續處理
  • 200~299:請求成功,表示請求已被成功接收、理解、接受
  • 300~399:重新導向,要完成請求必須進行更進一步的操作
  • 400~499:用戶端錯誤,請求有語法錯誤或請求無法實現
  • 500~599:伺服器端錯誤,伺服器未能實現合法的請求

常見的狀態代碼如下:

  • 200 OK:用戶端請求成功
  • 400 Bad Request:用戶端請求有語法錯誤,不能被伺服器所理解
  • 401 Unauthorized:請求未經授權,這個狀態碼必須和WWW-Authenticate前序域一起使用
  • 403 Forbidden:伺服器收到請求,但是拒絕提供服務
  • 500 Internal Server Error:伺服器發生不可預期的錯誤
  • 503 Server Unavailable:伺服器當前不能處理用戶端的請求,一段時間後可能恢複正常

例如訪問我的CSDN部落格地址響應的狀態行是:

HTTP/1.1 200 OK
4.HTTP的訊息前序

訊息前序分為通用前序、請求前序、響應前序、實體前序等。訊息頭由索引值對組成,每行一對,關鍵字和值用英文冒號“:”分隔。

通用前序

既可以出現在請求前序,也可以出現在響應前序中

  • Date:表示訊息產生的日期和時間
  • Connection:允許發送指定串連的選項,例如指定串連是連續的,或者指定“close”選項,通知伺服器,在響應完成後,關閉串連
  • Cache-Control:用於指定緩衝指令,緩衝指令是單向的(響應中出現的緩衝指令在請求中未必會出現),且是獨立的(一個訊息的緩衝指令不會影響另一個訊息處理的緩衝機制)
請求前序

請求前序通知伺服器關於用戶端求求的資訊,典型的要求標頭有:

  • Host:請求的主機名稱,允許多個網域名稱同處一個IP地址,即虛擬機器主機
  • User-Agent:發送請求的瀏覽器類型、作業系統等資訊
  • Accept:用戶端可識別的內容類型列表,用於指定用戶端接收那些類型的資訊
  • Accept-Encoding:用戶端可識別的資料編碼
  • Accept-Language:表示瀏覽器所支援的語言類型
  • Connection:允許用戶端和伺服器指定與請求/響應串連有關的選項,例如這是為Keep-Alive則表示保持串連。
  • Transfer-Encoding:告知接收端為了保證報文的可靠傳輸,對報文採用了什麼編碼方式。
響應前序

用於伺服器傳遞自身資訊的響應,常見的響應前序:

  • Location:用於重新導向接受者到一個新的位置,常用在更換網域名稱的時候
  • Server:包含可伺服器用來處理請求的系統資訊,與User-Agent請求前序是相對應的
實體前序

實體前序用來定於被傳送資源的資訊,既可以用於請求也可用於響應。請求和響應訊息都可以傳送一個實體,常見的實體前序為:

  • Content-Type:發送給接收者的實體本文的媒體類型
  • Content-Lenght:實體本文的長度
  • Content-Language:描述資源所用的自然語言,沒有設定則該選項則認為實體內容將提供給所有的語言閱讀
  • Content-Encoding:實體前序被用作媒體類型的修飾符,它的值指示了已經被應用到實體本文的附加內容的編碼,因而要獲得Content-Type前序域中所引用的媒體類型,必須採用相應的解碼機制。
  • Last-Modified:實體前序用於指示資源的最後修改日期和時間
  • Expires:實體前序給出響應到期的日期和時間
5.應用舉例

要想查看網頁或者手機請求網路的請求報文和響應報文有很多種方法,這裡推薦採用Fiddler,在Android利用Fiddler進行網路資料抓包這篇文章中詳盡介紹了如何使用Fiddler,在這裡就不贅述了。
開啟Fiddler,然後用瀏覽器訪問我的CSDN部落格網站:

點擊紅色畫筆的地區就可以看到請求報文和響應報文了

請求報文:

GET http://blog.csdn.net/itachi85 HTTP/1.1                                //請求行Host: blog.csdn.net                                                       //請求前序Connection: keep-aliveCache-Control: max-age=0       Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Upgrade-Insecure-Requests: 1User-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.400Accept-Encoding: gzip, deflate, sdchAccept-Language: zh-CN,zh;q=0.8Cookie: 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 GMTContent-Type: text/html; charset=utf-8Transfer-Encoding: chunkedConnection: keep-aliveKeep-Alive: timeout=20Vary: Accept-EncodingCache-Control: privateX-Powered-By: PHP 5.4.28Content-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-urlencodedHost: patientapi.shoujikanbing.comConnection: Keep-AliveUser-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.1Accept-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 GMTContent-Type: text/html;charset=utf-8Transfer-Encoding: chunkedConnection: keep-aliveVary: Accept-EncodingSet-Cookie: sessionId=0d1cee1f31926ffa8894c64804efa855101d56eb21caf5db5dcb9a4955b7fbc9; expires=Mon, 28-Mar-2016 09:02:20 GMT; Max-Age=86400; path=/; domain=.shoujikanbing.comSet-Cookie: PHPSESSID=0d1cee1f31926ffa8894c64804efa855101d56eb21caf5db5dcb9a4955b7fbc9; path=/; domain=.shoujikanbing.comExpires: Thu, 19 Nov 1981 08:52:00 GMTCache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0Pragma: no-cacheContent-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軟體中顯示的是亂碼。

Android網路編程(一)HTTP協議原理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.