HTTP報文(http權威指南第三章)

HTTP報文

本章將介紹:
- 報文是如何流動的
- HTTP報文的三個組成部分
- 請求和相應報文之間的的區別
- 請求報文支持的各種功能
- 和響應報文一起返回的各種狀態碼
- 各種各樣的HTTP首部都是用來做什麼的
1. 報文流
報文在客戶端,服務器和代理之間流動,術語“流入”,“流出”,“上游”,“下游”都是用來描述報文方向的
- 報文流入源端服務器
http使用術語“流入”和“流出”來描述事務處理的方向。報文流入源端服務器,工作完成之後,會流回用戶的Agent代理中
- 報文向下遊流動
所有報文的發送者都是接收者的上游,不管是請求報文還是響應報文,所有報文都會向下遊流動
2. 報文的組成部分
報文包含三部分:
- 起始行,對報文進行描述
- 首部,包含屬性
- 主體,可選的包含數據
起始行和首部是由行分隔的ASCII文本,每行以一個回車符+一個換行符作爲結束
- 報文的語法
請求報文的格式爲:

<method> <request-URL> <version>     
<headers>    

<entity-body>   

響應報文的格式爲:

<version> <status> <reason-phrase>  
<headers>   

<entity-body>   

下面對各部分進行簡要說明:
- 方法
客戶端希望服務器對資源執行的動作,是一個單一的詞
- 請求URL
命名了所請求的資源
- 版本
報文所使用的HTTP版本,格式爲HTTP/<major>.<minor>
- 狀態碼
三位數字描述了請求過程中所發生的情況
- 原因短語
數字狀態碼的可讀版本,包含行終止序列之前的所有文本
- 首部
可以有零個或多個首部,(名字:值)
- 實體的主體部分
由任意數據組成的數據塊
3. 方法
HTTP定義了一組被稱爲安全方法的方法,GET和HEAD方法都是安全的,因爲它們不會在服務器上產生結果
下面是常用的一些方法:
- GET 從服務器獲取一份文檔 不包含主體
- HEAD 只從服務器獲取文檔的首部 不包含主體
使用HEAD,可以:
a. 在不獲取資源的情況下了解資源的情況(判斷其類型)
b. 通過查看響應中的狀態碼,看看某個對象是否存在
c. 通過查看首部,測試資源是否被修改
- POST 向服務器發送需要處理的數據 包含主體
POST方法起初是用來向服務器輸入數據的,實際上會用它來支持HTML的表單。表單中填好的數據通常被送給服務器,然後由服務器將其發送到他要去的地方
- PUT 將請求的主體部分存儲到服務器上 包含主體
PUT方法的語義就是讓服務器用請求的主體部分來創建一個有所請求的URL命名的新文檔,如果那個URL已經存在的話,就用這個主體來替代它
- TARCE 對可能經過代理服務器傳送到服務器上去的報文進行跟蹤 不包含主體
一個請求可能經過多箇中間節點,每個中間節點都會修改原始的http請求。TRACE方法允許客戶端在最終將請求發送給服務器時,看看它變成了什麼樣子。
TRACE請求會在目的服務器端發起一個“換回”診斷,行程最後一站的服務器會彈回一條TRACE響應,並在響應主題中攜帶它受到的原始請求報文,這樣客戶端就可以查看原始報文是如何被修改的
TRACE方法主要用於診斷,也是一種很好的工具,可以用來查看代理和其他應用程序對用戶請求所產生的效果
- OPTONS 決定可以在服務器上執行哪些方法 不包含主體
OPTION方法請求web服務器告知其支持的各種功能,可以詢問服務器通常支持哪些方法,或者對某些特殊的資源支持哪些方法
- DELETE 從服務器上刪除一份文檔
DELETE方法所做的事情就是請服務器刪除請求URL所制定的資源,但是客戶端應用程序無法保證刪除操作一定會被執行,因爲http規範允許服務器在不通知客戶端的情況下撤銷請求
並不是所有的服務器都可以實現以上方法,其它服務器可能有自己的方法,被稱爲擴展方法
web發佈擴展方法示例:
- LOCK 允許用戶鎖定資源(編輯某個資源時,將其鎖定,以防別人同時對其進行修改)
- MKCOL 允許用戶創建資源
- COPY 便於在服務器上覆制資源
- MOVE 在服務器上移動資源
4. 狀態碼
http狀態碼分成了5大類
狀態碼分類:
1. 100-199 信息性狀態碼
- 狀態碼100 continue 說明收到請求的初始部分,請客戶端繼續。發送了這個狀態碼之後,服務器在收到請求之後必須進行響應
從很多方面來看,100 continue都是一種優化,客戶端應用程序直郵在避免向服務器發送一個服務器無法處理或使用的大實體時,才應該使用100 contiune。
如果服務器受到一條帶有值爲100 continue的Expect首部請求,它會用100 continue響應或一條錯誤嗎來進行響應。
- 狀態碼101 Switching Protocols 說明服務器正在根據客戶端的指定,將協議切換成Update首部所列的協議

  1. 200-299 成功狀態碼
    • 200
      OK,請求咩有問題,實體的主體部分包含了所請求的資源
    • 201
      Created,用於創建服務器對象的請求(比如PUT)。響應的實體主體部分中應該包含各種你用了已創建的資源URL,Location首部包含的則是最具體的引用
    • 202
      Accept,請求已被接受,但服務器還未對其執行任何動作。不能保證服務器會完成這個請求,這只是意味着接受請求時,它看起來時有效的
    • 203
      Non-Authoritative,實體首部包含的信息不是來自於源端服務器,而是來自資源的一個副本
    • 204
      No Content,響應報文中包含若干首部和一個狀態行,但沒有實體的主體部分
    • 205
      Reset Content,負責告知瀏覽器清楚當前頁面中的所有HTML表單元素
    • 206
      Partial Content,成功執行了一部分請求
  2. 300-399 重定向狀態碼
    • 300
      Multiple Choices,請求一個實際指向多個資源的URL時會返回這個狀態碼
    • 301
      Moved Permanently,請求的URL已被移除
    • 302
      Found,與301狀態碼類似,但是客戶端應該使用Location首部給出的URL來臨時定位資源,將來的請求仍應使用老的URL
    • 303
      See Other,告知客戶端應該使用另一個URL來獲取資源
    • 304
      Not Modefie
    • 305
      Use Proxy,必須通過一個代理來訪問資源
    • 307
      Temporary redirect,與301狀態碼類似,但是客戶端應該使用Location首部給出的URL來臨時定位資源,將來的請求仍應使用老的URL
  3. 400-499 400-415 客戶端錯誤
  4. 500-599 500-505 服務器錯誤
    • 500
      Internal Server Error,服務器遇到一個妨礙它爲請求提供服務的錯誤時,使用此狀態碼
    • 501
      Not Implemented,客戶端發出的請求超出服務器的能力範圍
    • 502
      Bad Gateway,作爲代理或網關使用的服務器從請求響應臉的下一條鏈路上受到了一條僞響應時,使用此狀態碼
    • 503
      Service Unavailable,用來說明服務器現在無法爲請求提供服務,但將來可以
    • 504
      Gateway Timeout,該響應來自一個網關或代理,它在等待另一個服務器對其請求進行響應時超時了
    • 505
      Http Version Not Supported,服務器受到的請求使用了它無法或不願支持的協議版本
      http中可以分爲以下幾類首部:
    • 通用首部
      既可以出現在請求報文中,也可以出現在響應報文中
    • 請求首部
      提供更多有關請求的信息
    • 響應首部
      提供更多有關響應的首部
    • 實體首部
      描述主體的長度和內容,或者資源本身
    • 擴展首部
      規範中沒有定義的新首部
      常見的首部實例:
    • Date:Tue 3Oct 2016 02:16:03 GMT 服務器產生響應的日期
    • Content-length:12240 實體的主體部分包含了12240字節的數據
    • Content-type:image/gif 實體的主體部分是一個GIF圖片
    • Accept:image/gif,image/jpeg,text/html 客戶端可以接收的格式
      將長的首部分爲多行可以提高可讀性,多出來的每行前面至少有一個空格或製表符
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章