10 響應狀態碼
狀態行
狀態行由三部分組成:Version + Status Code + Reason。
- Version 部分是 HTTP 協議的版本號,通常是 HTTP/1.1,用處不是很大
- Reason 部分是原因短語,是狀態碼的簡短文字描述,例如“OK”“Not Found”等等,也可以自定義。
但它只是為了兼容早期的文本客戶端而存在,提供的信息很有限,目前的大多數客戶端都會忽略它。 - 狀態碼一個十進制數字,以代碼的形式表示服務器對請求的處理結果。范圍是 000-999。
狀態碼的分類
- 1××:提示信息,表示目前是協議處理的中間狀態,還需要后續的操作;
- 2××:成功,報文已經收到并被正確處理;
- 3××:重定向,資源位置發生變動,需要客戶端重新發送請求;
- 4××:客戶端錯誤,請求報文有誤,服務器無法處理;
- 5××:服務器錯誤,服務器在處理請求時內部發生了錯誤。
常用的狀態碼
1xx
- 表示提示信息
- 101 Switching Protocols:轉換協議
- 客戶端使用 Upgrade 頭字段,要求在 HTTP 協議的基礎上改成其他的協議繼續通信,比如 WebSocket。
- 如果服務器也同意變更協議,就會發送狀態碼 101,但這之后的數據傳輸就不會再使用 HTTP 了。
2xx
- 表示服務器收到并成功處理了客戶端的請求,這也是客戶端最愿意看到的狀態碼。
- 200 OK
- 表示一切正常,服務器如客戶端所期望的那樣返回了處理結果
- 如果是非 HEAD 請求,通常在響應頭后都會有 body 數據。
- 204 No Content
- 含義與“200 OK”基本相同,但響應頭后沒有 body 數據。
- 206 Partial Content:“部分所含之物”
- HTTP 分塊下載或斷點續傳的基礎,在客戶端發送“范圍請求”、要求獲取資源的部分數據時出現
- 與 200 一樣,也是服務器成功處理了請求,但 body 里的數據不是資源的全部,而是其中的一部分
- 伴隨著頭字段“Content-Range”,表示響應報文里 body 數據的具體范圍,供客戶端確認
例如“Content-Range: bytes 0-99/2000”,意思是此次獲取的是總計 2000 個字節的前 100 個字節
3xx
- 表示客戶端請求的資源發生了變動,客戶端必須用新的 URI 重新發送請求獲取資源,也就是通常所說的“重定向”。
- 301 Moved Permanently
- “永久重定向”,含義是此次請求的資源已經不存在了,需要改用**新的 URI **再次訪問。
- 302 Found
- 俗稱“臨時重定向”,意思是請求的資源還在,但需要暫時用**另一個 URI **來訪問
- 301 和 302 都會在響應頭里使用字段 Location 指明后續要跳轉的 URI,最終的效果很相似,瀏覽器都會重定向到新的 URI。
- 304 Not Modified :未調整
- 用于 If-Modified-Since 等條件請求,表示資源未修改,用于緩存控制。
- 不具有通常的跳轉含義,但可以理解成“重定向已到緩存的文件”(即“緩存重定向”)。
4xx
- 客戶端發送報文有誤
- 400 Bad Request
- 報文錯誤,比較籠統
- 403 Forbidden
- 服務器禁止訪問資源
- 404 Not Found
- 服務器未找到,無法提供給客戶端,較籠統
- 其他
- 405 Method Not Allowed:不允許使用某些方法操作資源,例如不允許 POST 只能 GET;
- 406 Not Acceptable:資源無法滿足客戶端請求的條件,例如請求中文但只有英文;
- 408 Request Timeout:請求超時,服務器等待了過長的時間;
- 409 Conflict:多個請求發生了沖突,可以理解為多線程并發時的競態;
- 413 Request Entity Too Large:請求報文里的 body 太大;
- 414 Request-URI Too Long:請求行里的 URI 太大;
- 429 Too Many Requests:客戶端發送了太多的請求,通常是由于服務器的限連策略;
- 431 Request Header Fields Too Large:請求頭某個字段或總體太大;
5xx
- 表示客戶端請求報文正確,但服務器在處理時內部發生了錯誤,無法返回應有的響應數據,是服務器端的“錯誤碼”
- 500 Internal Server Error
- 和 400 類似,但是對服務器友好。
- 501 Not Implemented
- 客戶端請求的功能不支持
- 502 Bad Gateway
- 通常是服務器作為網關或者代理時返回的錯誤碼,表示服務器自身工作正常,訪問后端服務器時發生了錯誤,但具體的錯誤原因也是不知道的。
- 503 Service Unavailable
- 表示服務器當前很忙,暫時無法響應服務
- 臨時的
- 503 響應報文里通常還會有一個“Retry-After”字段,指示客戶端可以在多久以后再次嘗試發送請求。
疑問
-
你在開發 HTTP 客戶端,收到了一個非標準的狀態碼,比如 4××、5××,應當如何應對呢?
- 目前客戶端基本都是解析成失敗的情況,大部分給個失敗錯誤友好界面。
-
你在開發 HTTP 服務器,處理請求時發現報文里缺了一個必需的 query 參數,應該如何告知客戶端錯誤原因呢?
- 在返回body里面寫明錯誤原因,狀態碼一般給500。
浙公網安備 33010602011771號