Android 網絡編程系列(1)瞭解HTTP協議

前言

這篇文章算是正式開始學習的第一篇技術文章,在閱讀蒐集到的幾篇博客文章後,對 HTTP 協議的相關知識作一下總結。html

HTTP 是互聯網中最基礎的網絡協議,日常咱們上網瀏覽網頁、聽音樂、玩遊戲等行爲都離不開這個協議。對於開發者來講,在開發應用程序時,都少不了須要網絡功能。所以,瞭解 HTTP 協議是頗有必要的。編程

HTTP 協議簡介

HTTP 協議(HyperText Transfer Protocol,超文本傳輸協議)是一個基於 TCP/IP 的應用層網絡協議,它不涉及數據包的傳輸,規定了客戶端與服務器端的通訊格式。用於從萬維網(WWW)服務器傳輸超文本到本地客戶端。HTTP 從1991年發佈0.9版開始,通過20多年的發展,不斷完善和擴展。瀏覽器

HTTP 協議的工做原理緩存

HTTP 協議是基於 C/S(客戶端/服務端)架構模型來實現的。瀏覽器做爲客戶端向Web服務器發送請求,Web服務器收到請求後,向客戶端發送響應信息。常見的Web服務器有 Apache 服務器、IIS 服務器等。服務器

工做流程
工做流程

HTTP 協議的特色網絡

  1. 媒體獨立
    只要客戶端和服務端知道如何處理數據內容,HTTP 能夠傳輸任何類型的數據。
  2. 無鏈接
    無鏈接的意思是每次鏈接只處理一個請求,服務端處理完客戶端的請求後,並收到客戶端應答後就斷開鏈接,採用無鏈接的方式能夠節省傳輸時間。
  3. 無狀態
    HTTP 協議是無狀態協議,即一次請求和上一次的請求之間沒有任何關係。若是此次請求須要以前請求的信息,則須要將信息加入到此次請求當中。
    好比購物網站中,用戶登陸後購買商品,這時候購買商品的請求就須要加上當前用戶信息,不然服務器不知道到底是誰下了這個訂單。

HTTP URL 格式架構

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

http 表示使用 HTTP 協議來發送網絡請求;host 表示合法的 Internet 主機域名或者IP地址;port 表示端口號,HTTP 協議默認使用 80 端口,也能夠另外指定;abs_path 表示指定的 Web 服務器上可用資源的 URI。app

接下來介紹 HTTP 協議中的報文,包含兩種類型,請求報文和響應報文,分別對應客戶端向服務器發送請求以及服務器響應請求這兩個過程。curl

HTTP 請求報文

HTTP 請求報文的通常格式如圖所示:

enter image description here
enter image description here

請求報文包含請求行請求報頭空行請求數據 4 個部分。

請求行

請求行由請求方法、URL 字段和 HTTP 協議的版本組成,如示例:

GET www.runoob.com/http/http-t… HTTP/1.1

HTTP 的請求方法共有 8 個,HTTP 協議 1.0 版本中定義了GET、POST、HEAD 這 3 個方法,1.1 版本時又新增了PUT、DELETE、TRACE、CONNECT、OPTION 這 5 個方法。其中最經常使用的是 GET 和 POST。

請求報頭(header)

請求行以後會有 0 個或多個請求報頭,若是有請求報頭,則每行有 1 個請求頭,都是以鍵值對的形式表示,包括頭部域的名字和值,中間用 「:」 分隔。

空行

協議中用空行來表示請求報頭的結束,空行以後就是請求數據。

請求數據

請求數據是客戶端向服務器發送的數據,GET 請求中沒有請求數據,出如今使用 POST 方法來向服務器提交表單等情景中。和請求數據相關的最經常使用的請求頭是 Content-Type 和 Content-Length。

如下是一個完整的請求報文實例:

GET /hello.txt HTTP/1.1
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.example.com
Accept-Language: en, mi

HTTP 響應報文

HTTP 響應報文的通常格式以下圖所示:

enter image description here
enter image description here

響應報文包含狀態行響應報頭空行響應正文 4 個部分。空行表示響應頭部和正文的分隔,相應正文則表示服務器返回的資源的內容,主要介紹一下狀態行和 HTTP 協議中的消息報頭(請求報頭和響應報頭都屬於它的一個分類,因此放在一塊兒介紹)。

狀態行

狀態行依次包括 HTTP 版本、狀態碼以及該狀態碼對應的緣由短語,示例以下:

HTTP/1.1 200 OK

HTTP 狀態碼由三個十進制數字組成,第一個十進制數字定義了狀態碼的類型,後兩個數字沒有分類的做用。HTTP狀態碼共分爲5種類型:

  • 100~199 : 信息,服務器收到請求,須要請求者繼續執行操做
  • 200~299: 成功,操做被成功接收並處理
  • 300~399 : 重定向,須要進一步的操做以完成請求
  • 400~499 : 客戶端錯誤,請求包含語法錯誤或沒法完成請求
  • 500~599 : 服務器錯誤,服務器在處理請求的過程當中發生了錯誤

常見的HTTP狀態碼有:

  • 200 - 請求成功
  • 301 - 資源(網頁等)被永久轉移到其它URL
  • 404 - 請求的資源(網頁等)不存在
  • 500 - 內部服務器錯誤

HTTP 的消息報頭

消息報頭能夠分爲通用報頭、請求報頭、響應報頭和實體報頭。以鍵值對的形式存在,每行一對,名字和值之間用 「:」 來進行分隔。

通用報頭

通用報頭既能出如今請求報頭也能出如今響應報頭中。

  • Date : 發送消息的日期和時間
  • Connection : 容許發送指定鏈接的選項。例如指定鏈接是連續,或者指定 「close」 選項,通知服務器,在響應完成後,關閉鏈接
  • Cache-Control : 用於指定緩存指令,緩存指令是單向的(響應中出現的緩存指令在請求中未必會出現),且是獨立的(一個消息的緩存指令不會影響另外一個消息處理的緩存機制)

請求報頭

請求報頭容許客戶端向服務器端傳遞請求的附加信息以及客戶端自身的信息。

常見的請求報頭有:

  • Host : 發送請求時,該報頭域是必需的。Host 請求報頭域主要用於指定被請求資源的 Internet 主機和端口號,它一般從 HTTP URL 中提取出來。
  • User-Agent : 容許客戶端將它的操做系統、瀏覽器和其它屬性告訴服務器。
  • Accept : 用於指定客戶端接受哪些類型的信息。例如Accept:image/gif,代表客戶端但願接受 GIF 圖象格式的資源;Accept:text/html,代表客戶端但願接受 html 文本。
  • Accept-Charset : 用於指定客戶端接受的字符集。
  • Accept-Encoding : 用於指定可接受的內容編碼。
  • Accept-Language : 用於指定一種天然語言。例如 Accept-Language:zh-cn 表示支持中文。
  • Authorization : 請求報頭域主要用於證實客戶端有權查看某個資源。當瀏覽器訪問一個頁面時,若是收到服務器的響應代碼爲 401(未受權),能夠發送一個包含 Authorization 請求報頭域的請求,要求服務器對其進行驗證。

響應報頭

響應報頭用於服務器向客戶端發送信息。

常見的響應報頭有:

  • Location : 用於重定向接受者到一個新的位置,經常使用在更換域名的時候。
  • Server : 包含了服務器用來處理請求的軟件信息,與User-Agent請求報頭域是相對應的。
  • WWW-Authenticate : 必須被包含在 401(未受權的)響應消息中,客戶端收到 401 響應消息時候,併發送 Authorization 報頭域請求服務器對其進行驗證時,服務端響應報頭就包含該報頭域。

實體報頭

請求和響應消息均可以傳送一個實體。實體報頭定義了關於實體正文和請求所標識的資源的元信息。

常見的實體報頭有:

  • Content-Encoding : 被用做媒體類型的修飾符,它的值指示了已經被應用到實體正文的附加內容的編碼。
  • Content-Language : 描述了資源所用的天然語言。
  • Content-Length : 用於指明實體正文的長度,以字節方式存儲的十進制數字來表示。
  • Content-Type : 實體報頭域用語指明發送給接收者的實體正文的媒體類型。
  • Last-Modified : 用於指示資源的最後修改日期和時間。

如下是一個響應報文的實例:

HTTP/1.1 304 Not Modified
Date: Thu, 12 Oct 2017 09:20:27 GMT
Via: 1.1 varnish
Cache-Control: max-age=600
Expires: Thu, 12 Oct 2017 09:02:02 GMT
Age: 0
Connection: keep-alive
X-Served-By: cache-hkg17934-HKG
X-Cache: MISS
X-Cache-Hits: 0
X-Timer: S1507800028.883579,VS0,VE164
Vary: Accept-Encoding
X-Fastly-Request-ID: 17fc09b064ce9669f38931c159ec01384cc3f8de

結語

HTTP 協議的有關知識暫時就到這裏,大體上梳理了 HTTP 協議的總體工做流程,掌握了大部分的內容,其中的一些細節仍是沒有把握好,好比消息報頭、Content-Type 沒有深刻的去理解。(本文圖片轉載自菜鳥教程與劉望舒博客,侵刪)

下一篇文章,將是有關 Android 中 WebView 的使用。

下次見。

參考文章

學習過程當中閱讀了以下幾篇文章和教程,感謝這些做者辛勤付出。

劉望舒: Android網絡編程(一)HTTP協議原理
liuwangshu.cn/application…
Jeffrey : HTTP協議詳解
www.cnblogs.com/li0803/arch…
阮一峯: HTTP 協議入門
www.ruanyifeng.com/blog/2016/0…
菜鳥教程: HTTP 教程
www.runoob.com/http/http-t…

相關文章
相關標籤/搜索