1. 程式人生 > 實用技巧 >HTTP 報文

HTTP 報文

有兩種 HTTP 報文的型別,請求(request)與響應(response),每種都有其特定的格式,下面將分別介紹這兩種型別的報文。

一、HTTP 請求

HTTP 請求報文由請求行(Request Line)請求頭(Request Header)請求體(Request Body)這三部分組成,下圖是HTTP請求報文的格式:

備註

  • 請求行和請求頭都是以回車符<CR> + 換行符<LF>作為結束標誌,同時在請求頭的後面緊跟的是請求空行,這一行僅傳送回車符<CR> + 換行符<LF>,用來表示請求頭已傳送完成,這樣做是因為請求頭的個數是不確定的,如果沒有加入請求空行,WEB伺服器就無法知道請求頭到底什麼時候結束。
  • 並不是所有的請求都有請求體,如GETDELETE請求是沒有請求體的,而POSTPUT請求是有請求體的。

1、請求方法

下面將列出所有請求方法的名稱及描述:

序號 方法名稱 描述
1 GET GET方法請求一個指定資源的表示形式,使用GET的請求應該只被用於獲取資料
2 HEAD HEAD方法請求一個與GET請求的響應相同的響應,但沒有響應體
3 POST POST方法用於將實體提交到指定的資源,通常導致在伺服器上的狀態變化或副作用
4 PUT PUT方法用請求有效載荷替換目標資源的所有當前表示
5 DELETE DELETE方法刪除指定的資源
6 CONNECT CONNECT方法建立一個到由目標資源標識的伺服器的隧道
7 OPTIONS OPTIONS方法用於描述目標資源的通訊選項
8 TRACE TRACE方法沿著到目標資源的路徑執行一個訊息環回測試
9 PATCH PATCH方法用於對資源應用部分修改

若需獲知更多關於請求方法的資訊,請參閱RFC 7231

2、URL

URL,即統一資源定位器(Uniform Resource Locator),是因特網的全球資訊網服務程式上用於指定資訊位置的表示方法。

注意

  1. URL 只能使用 ASCII 字符集來通過因特網進行傳送。由於 URL 常常會包含 ASCII 集合之外的字元,URL 必須轉換為有效的 ASCII 格式。
  2. URL 編碼使用 "%" 其後跟隨兩位的十六進位制數來替換非 ASCII 字元。
  3. URL 不能包含空格。URL 編碼通常使用 + 來替換空格。

更多關於 URL 的知識,可以檢視菜鳥教程 - HTML URL 編碼

3、請求頭

客戶端傳送請求頭欄位以提供更多資訊。關於請求上下文、根據目標資源狀態建議響應的首選格式、提供身份驗證憑據或修改預期請求處理。這些欄位充當請求修飾符,類似於程式語言方法呼叫的引數。

下面將列出一些常用的請求頭:

請求頭 說明
Accept 指定客戶端能夠接收的內容型別
Authorization HTTP授權的授權證書
Cache-Control 指定請求和響應遵循的快取機制
Connection 表示是否需要持久連線(HTTP 1.1預設進行持久連線)
Cookie HTTP請求傳送時,會把儲存在該請求域名下的所有cookie值一起傳送給web伺服器
Content-Length 請求的內容長度
Content-Type 請求的與實體對應的MIME資訊
Date 請求傳送的日期和時間
Host 指定請求的伺服器的域名和埠號
If-Range 如果實體未改變,伺服器傳送客戶端丟失的部分,否則傳送整個實體。引數也為Etag
Range 只請求實體的一部分,指定範圍
Referer 先前網頁的地址,當前請求網頁緊隨其後,即來路
User-Agent User-Agent的內容包含發出請求的使用者資訊
Via 通知中間閘道器或代理伺服器地址,通訊協議
Warning 關於訊息實體的警告資訊

若需獲知更多關於響應頭的資訊,請參閱RFC 7231

4、請求體

請求體是瀏覽器向伺服器傳送的請求資料,格式由Content-Type請求頭指定,常見的有x-www-form-urlencodedform-data等。

二、HTTP響應

HTTP 響應報文由狀態行(status-line)響應頭(response header)響應體(response body)這幾部分組成,下圖為 HTTP 響應報文的格式:

1、狀態碼

狀態程式碼元素是一個三位整數程式碼,它將試圖理解和滿足請求的結果。狀態碼由三位數字組成,第一位數字表示響應的型別,常用的狀態碼有五大類如下表所示:

狀態碼 描述
1XX 資訊,伺服器收到請求,需要請求者繼續執行操作
2XX 成功,操作被成功接收並處理
3XX 重定向,需要進一步的操作以完成請求
4XX 客戶端錯誤,請求包含語法錯誤或無法完成請求
5XX 伺服器錯誤,伺服器在處理請求的過程中發生了錯誤

下面將列出一些常用的 HTTP 響應狀態碼:

狀態碼 狀態碼描述 解釋
200 OK 請求成功
201 Created 成功請求並建立了新的資源
202 Accepted 已經接受請求,但未處理完成
302 Found 臨時移動,但資源只是臨時被移動,客戶端應繼續使用原有URI
304 Not Modified 未修改。所請求的資源未修改,伺服器返回此狀態碼時,不會返回任何資源
400 Bad Request 客戶端請求的語法錯誤,伺服器無法理解
401 Unauthorized 請求要求使用者的身份認證
403 Forbidden 伺服器理解請求客戶端的請求,但是拒絕執行此請求
404 Not Found 伺服器無法根據客戶端的請求找到資源(網頁)
405 Method Not Allowed 客戶端請求中的方法被禁止
500 Internal Server Error 伺服器內部錯誤,無法完成請求
502 Bad Gateway 作為閘道器或者代理工作的伺服器嘗試執行請求時,從遠端伺服器接收到了一個無效的響應

若需獲知更多關於響應狀態碼的資訊,請參閱RFC 7231

2、響應頭

響應頭欄位允許伺服器傳遞有關響應的附加資訊,而不是狀態行中的資訊。這些頭欄位提供有關伺服器、進一步訪問目標資源或相關資源的資訊。

下面將列出一些常見的響應頭:

響應頭 說明
Access-Control-Allow-Origin 指定哪些網站可以跨域源資源共享
Age 響應物件在代理快取中存在的時間,以秒為單位
Allow 對於特定資源的有效動作
Cache-Control 通知從伺服器到客戶端內的所有快取機制,表示它們是否可以快取這個物件及快取有效時間,其單位為秒
Connection 針對該連線所預期的選項
Content-Disposition 對已知MIME型別資源的描述,瀏覽器可以根據這個響應頭決定是對返回資源的動作,如:將其下載或是開啟
Content-Encoding 響應資源所使用的編碼型別
Content-Length 響應訊息體的長度,用8進位制位元組表示
Content-Type 當前內容的MIME型別
Date 此條訊息被髮送時的日期和時間(以RFC 7231中定義的"HTTP日期"格式來表示)
ETag 對於某個資源的某個特定版本的一個識別符號,通常是一個 訊息雜湊
Expires 指定一個日期/時間,超過該時間則認為此迴應已經過期
Last-Modified 所請求的物件的最後修改日期
Location 用於在進行重定向,或在建立了某個新資源時使用
Refresh 用於重定向,或者當一個新的資源被建立時,預設會在5秒後重新整理重定向
Server 伺服器的名稱
Set-Cookie 設定HTTP cookie
Vary 告知下游的代理伺服器,應當如何對以後的請求協議頭進行匹配,以決定是否可使用已快取的響應內容而不是重新從原伺服器請求新的內容
WWW-Authenticate 表示在請求獲取這個實體時應當使用的認證模式

若需獲知更多關於響應頭的資訊,請參閱RFC 7231

3、響應體

響應體是伺服器返回給客戶端的文字資訊,資訊的格式可通過Content-Type響應頭來指定,如常見的text/html以及前後端使用JSON交換資料時使用的application/json

三、舉例

下面我們以一個簡單的使用者註冊為例,分析一次 HTTP 請求和響應的完整過程。

1、傳送請求

  • 採用GET請求方式向伺服器傳送表單資訊

    通過觀察可以發現GET請求方法是直接將表單資訊寫入到URL當中,要注意URL的長度是有限制的,不同的瀏覽器和不同的伺服器所能接受的最大長度是不一致的,因此要控制請求引數的長度。

  • 採用POST請求方式向伺服器傳送表單資訊

    可以看到POST請求方式是將表單資訊寫在請求體中,請求體中的資料格式並不是固定的,只要雙方約定好寫入資料的格式,伺服器就能根據約定解析資料,此外請求體的長度是沒有限制的,理論上可以寫入任意長度的資料。

2、響應結果

接著上面的登入案例,當點選註冊按鈕之後瀏覽器向伺服器傳送請求,伺服器處理請求並返回結果,瀏覽器收到的響應報文如下:

除了狀態行和響應頭之外,瀏覽器還收到了響應體,MIME型別為text/html,使用的字符集為utf-8,響應體內容如下:

<h1>註冊成功!</h1>

瀏覽器解析響應體內容並將其展示在頁面上: