讀HTTP協議(RFC-2616)總結

potato123發表於2009-05-20

1.資源(Resource)
      什麼是資源,首先我們看《架構風格與基於網路的軟體架構設計》的作者:Roy Thomas Fielding對資源的一個說明

Roy Thomas Fielding 寫道
REST對於資訊的核心抽象是資源。任何能夠被命名的資訊都能夠作為一個資源:一份文件或一張圖片、一個暫時性的服務(例如,“洛杉磯今日的天氣”)、一個其他資源的集合、一個非虛擬的物件(例如,人)等等。換句話說,任何可能作為一個創作者的超文字引用的目標的概念都必須符合資源的定義。一個資源是到一組實體的概念上的對映,而不是在任何特定時刻與該對映相關聯的實體本身。
更精確地說,資源R是一個隨時間變化的成員函式MR(t),該函式將時間t對映到等價的一個實體或值的集合,集合中的值可能是資源的表現和/或資源的識別符號。一個資源可以對映到空集,這允許在一個概念的任何實現存在之前引用這個概念——這一觀念對於Web之前的大多數超文字系統來說比較陌生 [61]。一些資源在它們被建立後的任何時刻來檢查,它們都對應著相同的值的集合,從這個意義上說它們是靜態的。其他的資源所對應的值則會隨時間而頻繁地變化。對於一個資源來說,唯一必須是靜態的是對映的語義,因為語義才是區別資源的關鍵。

       簡而言之,資源是一個抽象的東西,而在具體資源訪問時,會根據內容協商的結果表示成一個具體表述(Representations)。每個資源由統一的資源識別符號(URI)來描述,類似於資源的ID,或者說資源的地址。
2.表述(Representations)
      表述是資源的具體表現形式,譬如,今天深圳的天氣(資源),可以使用一副天氣jpg圖來描述,也可以XML資料來描述,也可以使用HTML的頁面來描述,一種資源可以有多種表述,也就是說,通過同一個URI地址可以獲取到多種表現形式,而具體怎麼表現,則取決於Web客戶端與Web服務端內容協商的一個結果。
3.內容協商
      客戶端和服務端通過內容協商來協商請求內容和響應內容的格式,主要協商的內容包括:
      請求協商:
      1)字符集(Accept-Charset):客戶端通過傳送該協商建議服務端使用該字符集來傳送響應結果,譬如
Accept-Charset=gb2312,utf-8;q=0.7,*;q=0.7,客戶端建議服務端優先使用gb2312或者utf-8來傳送響應結果
      2)請求編碼(Accept-Encoding):客戶端告訴服務端客戶端所支援的編碼格式,譬如Accept-Encoding   =gzip,deflate表明客戶端支援gzip壓縮或者普通響應的結果
      3)語言(Accept-Language):客戶端通過傳送該協商告訴服務端客戶端所使用的語言,譬如Accept-Language=zh-cn,zh;q=0.5表明客戶端偏號的語言是中文,譬如對於”今天深圳的天氣“這個資源來說,服務端可以通過該選項決定使用什麼語言來表述資源
      4)表述偏好(Accept):客戶端通過該選項告訴服務端其表述的偏號,譬如一個請求”今天深圳的天氣“的Ajax程式,可以通過設定表述偏好為Accept=application/json來告訴服務端,希望得到Json描述的結果,而一個瀏覽器則可以通過傳輸表述偏好為Accept=text/html來告訴服務端,希望得到Html描述的結果
      響應協商:
      1)表述/表述字符集(Content-Type):服務端通過該協商告訴客戶端表述的格式和字符集的情況,譬如Content-Type=text/html; charset=utf-8表示響應內容格式為Html,字符集為utf-8
       2)表述編碼(Accept-Encoding):服務端通過該協商告訴客戶端表述的編碼,譬如Content-Encoding=gzip服務端告訴客戶端內容使用gzip壓縮
4.方法
     方法定義了對資源的操作,主要的方法包括GET、POST、UPDATE、DELETE等等,它們分別代表了對資源的讀、建、改、刪的操作
5.快取
      HTTP協議支援在Web的各個節點對資源的表述進行快取,譬如在瀏覽器客戶端、代理伺服器、反向代理伺服器、目標伺服器等上對錶述進行快取(注意,此處的快取不僅僅是指在目標伺服器上進行的業務級別的快取)
      1)客戶端請求
      如果客戶端快取了某些表述,則在進行讀請求(GET)時,攜帶請求條件(所謂的條件GET,使用Cache-Control指令),服務端接收到客戶端的請求條件,比較確認客戶端的表述是否過時,如果沒有,則返回304響應,否則則把最新的表述響應給客戶端
      2)服務端響應
      服務端對一些需要快取的表述,則響應中攜帶快取指令,告訴請求客戶端如何對錶述進行快取
      3)方法對快取的影響
      當對一個資源進行UPDATE或DELETE時,請求途經的所有伺服器(如代理伺服器、反向代理伺服器、目標伺服器)會自動將該資源對應的所有表述 快取失效。
6.狀態碼
      狀態碼描述了資源請求的結果,主要狀態碼包括:
      1)1XX:資訊類
      2)2XX:成功類
         典型的成功響應包括:
         200 OK,表示請求正常處理
         201 Created,表示POST請求已經接受,資源已建立,對於此響應,一般響應會攜帶新建資源的Reference給請求客戶端
         202 Accepted,表示POST/UDATE請求已經接受,但不一定處理,譬如對於POST/UPDATE請求為後臺新建執行緒處理,可以使用該響應碼
      3)3XX: 重定向類
         典型的重定向響應包括:
         300 Multiple Choice:表明請求的資源有多種表述
         301 Moved Permenently:表明所請求的資源已轉移到其他位置,建議到新的位置上去請求資源
         304 Not Modify:主要是針對攜帶條件的GET請求,服務端向客戶端表明所請求的資源沒有發生變化,可以繼續使用客戶端已快取的資料
      4)4XX: 客戶端錯誤類
         典型的客戶端錯誤響應包括:
         400 Bad Request:表明客戶端的請求格式服務端無法識別
         403 Forbiden:客戶端要訪問的資源許可權受限,不允許訪問
         404 Not found:客戶端要訪問的資源不存在
         405 Method Not Allowed:客戶端請求的方法不允許,譬如有可能一個資源不允許刪除,則不允許進行DELETE請求
         408 Request Timeout:請求超時
      5)5XX: 服務端錯誤類
         典型的服務端響應包括:
         500 Internal Server Error:伺服器內部錯誤,無法響應
         503 Service Unavailable:伺服器無法處理當前請求
         504 Gateway Timeout:閘道器超時

相關文章