1. 程式人生 > >Android 網路(一) HTTP協議

Android 網路(一) HTTP協議

前言

現如今,網路無處不在。對於Android開發者而言,免不了涉及到對網路的訪問。於是挖個坑= = ,介紹一下Android下關於網路程式設計的方方面面,本文將講述HTTP協議的一些必備知識。

HTTP協議簡介

超文字傳輸協議(HTTP,HyperText Transfer Protocol)是網際網路上應用最為廣泛的一種網路協議。它是一個屬於應用層的面向物件的協議,所有的WWW檔案都必須遵守這個標準。

協議特點

  • 採用C/S模型:
    –Client:瀏覽器(瀏覽器)請求,接收,顯示“網路物件
    –Server:Web伺服器根據請求傳送物件。
    C/S架構圖示
  • 使用TCP傳輸協議
  • 無連線:無連線的含義是限制每次連線只處理一個請求。伺服器處理完客戶的請求,並收到客戶的應答後,即斷開連線。採用這種方式可以節省傳輸時間。
  • 無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味著如果後續處理需要前面的資訊,則它必須重傳,這樣可能導致每次連線傳送的資料量增大。另一方面,在伺服器不需要先前資訊時它的應答就較快。

格式

HTTP報文

HTTP報文分為請求報文響應報文兩種基本分類。一般來說,一個響應對應一個請求。

  • 請求報文是客戶端傳送給伺服器的用於請求服務和資源的訊息
  • 響應報文是伺服器對請求訊息的應答。

HTTP請求報文

首先,放上上課時PPT中的截圖(我還只是個學生,笑)
HTTP請求

請求行

由上圖,顯而易見:

請求行 = 請求方法 + 空格 + URL + 空格 + HTTP協議版本
示例 :GET /somedir/page.html
HTTP/1.1

其中URL就是一個統一資源識別符號,HTTP協議版本就是字面上的意思,表明請求的HTTP協議版本。

HTTP請求方法有8種,說明如下:
Method

請求方法 說明
GET 請求獲取Request-URI所標識的資源
POST 在Request-URI所標識的資源後附加新的資料
HEAD 請求獲取由Request-URI所標識的資源的響應訊息報頭
PUT 請求伺服器儲存一個資源,並用Request-URI作為其標識
DELETE 請求伺服器刪除Request-URI所標識的資源
TRACE 請求伺服器回送收到的請求資訊,主要用於測試或診斷
CONNECT 保留將來使用
OPTIONS 請求查詢伺服器的效能,或者查詢與資源相關的選項和需求

對於Android開發而言,我們最關注的其實也就只有POSTGET

GET與POST對比

我就不再個人贅述了,直接放上一篇比較系統的分析文章

請求報頭

請求報頭和方法配合工作,決定客戶端能做什麼事情,詳見訊息報頭

請求資料

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

HTTP響應報文

image.png

狀態行

每條響應報文都會包含一個3位數字和可讀的狀態,用來告訴客戶端,伺服器發生了什麼事情。數字狀態碼便於程式處理差錯,原因短語更便於人們理解。狀態碼分為5類:

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

常見的狀態碼如下,詳情參見HTTP狀態碼維基百科

  • 101 Switching Protocols:伺服器正在根據客戶端的指定,將協議切換成Update首部所示的協議。
  • 200 OK:伺服器已成功處理了請求並提供了請求的網頁
  • 204 No Content:伺服器成功處理了請求,但沒有返回任何內容
  • 301 Moved Permanently:請求的網頁已永久移動到新位置。響應的Location首部應包含資源現在所處的URL。
  • 302 Found:與301類似,但這裡的移除是臨時的。將來的請求仍應使用老的URL。
  • 304 Not Modified:客戶的快取資源是最新的,要客戶端使用快取。
  • 400 Bad Request:告知客戶端傳送了一個錯誤的請求。
  • 403 Forbidden:請求被伺服器拒絕了。(可能是沒有訪問伺服器的許可權)
  • 404 Not Found:伺服器無法找到所請求的URL。
  • 410 Gone:伺服器曾經有這個資源,現在沒有了,與404類似。
  • 500 Internal Server Error:伺服器遇到一個錯誤,使其無法為請求提供服務。
  • 502 Bad Gateway:作為代理或閘道器使用的伺服器收到了上游的無效響應。
  • 503 Service Unavailable:伺服器現在無法為請求提供服務,但過一段時間就可以恢復服務。

響應報頭

見下文HTTP訊息報頭

響應正文

好像沒什麼好說的= =!

HTTP訊息報頭

訊息報頭和方法配合工作,共同決定了客戶端和伺服器能做什麼事情。可以將/訊息報頭分為通用報頭、請求報頭、響應報頭、實體報頭等,以下將分類詳細說明。

通用報頭

客戶端和伺服器都可以使用,提供與報文下相關的最基本的資訊。
* Connection:允許客戶端和伺服器指定與請求/響應連線相關的選項
* Date:日期和時間標誌,說明報文是什麼時刻建立的
* MIME-Version:給出了傳送端使用的MIME版本
* Transfer-Encoding:告知接收端為了保證報文的可靠傳輸,對報文采用了什麼編碼方式
* Via:顯示了報文經過的中間節點(代理、閘道器等等)
* Cache-Control:用於隨報文傳送快取指示
* Pragma:另一種隨報文傳送指示的方式,但並不專用於快取

請求報頭

只在請求報文中有意義,用於說明是誰或什麼在傳送請求、請求源自何處,或客戶端的喜好及能力等。

  • Host:請求的主機名,允許多個域名同處一個IP地址,即虛擬主機
  • User-Agent:傳送請求的瀏覽器型別、作業系統等資訊
  • Accept:客戶端可識別的內容型別列表,用於指定客戶端接收那些型別的資訊
  • Accept-Encoding:客戶端可識別的資料編碼
  • Accept-Language:表示瀏覽器所支援的語言型別
  • Referer:提供了包含當前請求URI的文件的URL

響應報頭

為客戶端提供了一些額外資訊,比如誰在傳送響應、響應者的功能、其它一些特殊指令等

  • Location:用於重定向接受者到一個新的位置,常用在更換域名的時候
  • Server:包含可伺服器用來處理請求的系統資訊,與User-Agent請求報頭是相對應的
  • Age:(從最初建立開始)響應持續時間
  • Public:伺服器為其資源支援的請求方法列表
  • Retry-After:如果資源不可用,在此時間重試
  • Accept-Ranges:(協商首部)對此資源來說,伺服器可接受的範圍型別
  • Set-Cookie:(安全首部)類似Cookie,用於設定Cookie

實體報頭

用來描述HTTP報文的負荷,提供了有關實體及其內容的大量資訊,可以告知報文的接收者它在對什麼進行處理
* Allow:列出可以對此實體執行的請求方法
* Content-Type:傳送給接收者的實體正文的媒體型別
* Content-Lenght:實體正文的長度
* Content-Language:描述資源所用的自然語言,沒有設定則該選項則認為實體內容將提供給所有的語言閱讀
* Content-Encoding:實體報頭被用作媒體型別的修飾符,它的值指示了已經被應用到實體正文的附加內容的編碼,因而要獲得Content-Type報頭域中所引用的媒體型別,必須採用相應的解碼機制。

  • Last-Modified:實體報頭用於指示資源的最後修改日期和時間
  • Expires:實體報頭給出響應過期的日期和時間

總結

  • 本文對HTTP協議中的必備知識做出講解。
  • 筆者水平有限,如有錯漏,歡迎指正。
  • 接下來我將持續推出Android網路相關的一系列文章,包括HttpURLConnection、Volley、OkHttp3、Retrofit2的使用等,有興趣可以關注whd_Alive的Android開發筆記
  • 不定期分享Android開發相關的技術乾貨,期待與你的交流,共勉。