全網最全的HTTP狀態碼解讀(Status Code=200/301/302/401/403/404/405/500/502/504)

這可能是全網最全的HTTP狀態碼解釋,強烈建議您收藏。

在前後端開發、服務器運維等場景中,經常需要處理網絡請求。瞭解HTTP狀態碼,可以快速判斷常見問題。

簡介

定義

HTTP狀態碼(HTTP Status Code)是表示網頁服務器超文本傳輸協議響應狀態的3位數字代碼

  • 由 RFC 2616 規範定義的,並得到 RFC 2518、RFC 2817、RFC 2295、RFC 2774 與 RFC 4918 等規範擴展
  • 官方註冊表1由IANA機構維護(IANA是什麼?

作用過程

HTTP協議中,客戶端發出請求連接、服務端建立連接,客戶端發出HTTP請求,服務端返回響應信息。
而在這個過程中,由於客戶端或服務端的問題會返回相應的錯誤代碼,不同代碼表示不同的信息,客戶端可以根據編碼、調整相應的操作來修改出現的錯誤,最終避免錯誤的再現。

下圖是簡化的交互過程,忽略了網絡握手等細節。

客戶端服務端發起請求返回響應、狀態碼根據狀態碼,決定需否調整操作客戶端服務端

五種分類

所有狀態碼的第一個數字,代表了響應的五種狀態。

  • 最常見的是成功類即2xx,其中最常用的是200
  • 其次是客戶端錯誤4xx和服務端錯誤5xx
  • 1xx3xx一般瀏覽器會自動處理、用戶感知不強,所以不常見
狀態碼 描述 解釋
1xx INFORMATIONAL
信息性
臨時的響應,只包含狀態行和某些可選的響應頭信息,並以空行結束。
客戶端在收到常規響應之前,應準備接收一個或多個1XX響應
2xx SUCCESSFUL
成功
服務器成功接收客戶端去哪個區,理解並接受
3xx REDIRECTION
重定向
客戶端必須採取進一步的措施才能完成請求。
* 例:瀏覽器可能不得不請求服務器上的不同頁面,或者通過代理服務器重複該請求。
* 通常這些狀態碼用來重定向,後續的請求地址(重定向目標)在本次響應的 Location 域中指明
4xx CLIENT_ERROR
客戶端錯誤
客戶端請求包含錯誤的語法或參數錯誤。
* 例:客戶端請求不存在的頁面,客戶端未提供有效的身份驗證信息
* 這些狀態碼適用於任何請求方法。瀏覽器應當向用戶顯示任何包含在此類錯誤響應中的實體內容
* 如果錯誤發生時,客戶端正在傳送數據,那麼服務器關閉TCP連接前,應確保客戶端收到了錯誤信息。如果客戶端之後繼續向服務器發送數據,服務器的TCP棧將向客戶端發送一個重置數據包,以清除該客戶端所有還未識別的輸入緩衝,以免這些數據被服務器上的應用程序讀取並干擾後者
5xx SERVER_ERROR
服務器錯誤
服務器遇到錯誤而不能完成客戶端有效請求,也有可能是服務器意識到以當前的軟硬件資源無法完成對請求的處理。
除非這是一個HEAD 請求,否則服務器應當包含一個解釋當前錯誤狀態以及這個狀況是臨時的還是永久的解釋信息實體。瀏覽器應當向用戶展示任何在當前響應中被包含的實體

也可能會出現服務器沒有返回狀態碼的情況,可能是網絡問題、網站崩潰、客戶端IP被封等。

狀態碼列表

Java開發中,可在spring-web包找到org.springframework.http.HttpStatus類,查看每個狀態碼的描述,有助於理解該狀態碼的含義。

下面列出了所有的狀態碼,解釋中已詳細說明了各狀態的用途。

有興趣的可以查看官方說明1或下表的“協議標準”,對狀態的來龍去脈和用途有非常詳細的展開。百度詞條2中也有對部分狀態做了詳細的解讀,只是比較少。

狀態碼 描述 解釋 協議標準
100 Continue(繼續) 服務器僅收到部分請求,但服務器並未拒絕該請求,客戶端應繼續發送其餘的請求 RFC7231, Section 6.2.1
101 Switching Protocols 服務器轉換協議:服務器將遵從客戶的請求轉換到另外一種協議 RFC7231, Section 6.2.2
102 Processing 參考協議標準 RFC2518
103 Early Hints 參考協議標準 RFC8297
104-199 Unassigned
200 OK(成功) 請求響應體包含服務器返回的數據 RFC7231, Section 6.3.1
201 Created 請求被創建完成,同時新的資源被創建 RFC7231, Section 6.3.2
202 Accepted 服務器已接受請求,但是處理未完成 RFC7231, Section 6.3.3
203 Non-Authoritative Information 文檔已經正常地返回,但返回了可能來自另一來源的信息 RFC7231, Section 6.3.4
204 No Content 請求收到,但返回信息爲空。也表示沒有新文檔,瀏覽器應該繼續顯示原來的文檔。如果用戶定期地刷新頁面,而Servlet可以確定用戶文檔足夠新,這個狀態代碼是很有用的 RFC7231, Section 6.3.5
205 Reset Content 沒有新文檔。但瀏覽器應該重置它所顯示的內容。用來強制瀏覽器清除表單輸入內容。 RFC7231, Section 6.3.6
206 Partial Content 客戶發送了一個帶有Range頭的GET請求,服務器完成了它 RFC7233, Section 4.1
207 Multi-Status 參考協議標準 RFC4918
208 Already Reported 參考協議標準 RFC5842
209-225 Unassigned
226 IM Used 參考協議標準 RFC3229
227-299 Unassigned
300 Multiple Choices 多重選擇,返回鏈接列表。用戶可以選擇某鏈接到達目的地。最多允許五個地址 RFC7231, Section 6.4.1
301 Moved Permanently 請求已永久轉移到新地址。返回新地址。 RFC7231, Section 6.4.2
302 Found 請求臨時轉移到新地址。返回新地址。 RFC7231, Section 6.4.3
303 See Other 所請求的頁面可在別的url下被找到,建議客戶端訪問其他URL RFC7231, Section 6.4.4
304 Not Modified 未按預期修改文檔。客戶端有緩衝的文檔併發出了一個條件性的請求(一般是提供If-Modified-Since頭表示客戶只想比指定日期更新的文檔)。服務器告訴客戶,原來緩衝的文檔還可以繼續使用 RFC7232, Section 4.1
305 Use Proxy 客戶端的請求應該通過Location頭所指明的代理服務器提取 RFC7231, Section 6.4.5
306 (Unused) 前一版本HTTP中使用的代碼,現行版本中不再使用 RFC7231, Section 6.4.6
307 Temporary Redirect 被請求的資源已經臨時移至新的url RFC7231, Section 6.4.7
308 Permanent Redirect 參考協議標準 RFC7538
309-399 Unassigned
400 Bad Request 請求有錯誤,如語法錯誤導致服務器無法理解、或參數錯誤 RFC7231, Section 6.5.1
401 Unauthorized 請求授權失敗,需要進行用戶認證。客戶端可再次發起請求、並在請求頭中提供一個包含認證證書、如會話跟蹤cookie RFC7235, Section 3.1
402 Payment Required 此代碼尚無法使用 RFC7231, Section 6.5.2
403 Forbidden 請求被禁止、超出訪問權限。與401不同,請求已經通過了身份驗證,只是沒有獲得資源授權 RFC7231, Section 6.5.3
404 Not Found 服務器無法找到被請求的資源 RFC7231, Section 6.5.4
405 Method Not Allowed 請求中指定的方法不被允許 RFC7231, Section 6.5.5
406 Not Acceptable 服務器生成的響應無法被客戶端所接受 RFC7231, Section 6.5.6
407 Proxy Authentication Required 用戶必須首先使用代理服務器進行驗證,這樣請求才會被處理 RFC7235, Section 3.2
408 Request Timeout 請求超出了服務器的等待時間,客戶端沒有在指定時間內完成請求 RFC7231, Section 6.5.7
409 Conflict 由於衝突,請求無法被完成 RFC7231, Section 6.5.8
410 Gone 被請求的頁面不可用 RFC7231, Section 6.5.9
411 Length Required “Content-Length” 未被定義。如果無此內容,服務器不會接受請求 RFC7231, Section 6.5.10
412 Precondition Failed 請求中的前提條件被服務器評估爲失敗 RFC7232, Section 4.2
413 Payload Too Large 請求的資源大於服務器允許的大小,服務器不會接受請求 RFC7231, Section 6.5.11
414 URI Too Long 請求的資源URL長於服務器允許的長度,服務器不會接受請求。當post請求被轉換爲帶有很長的查詢信息的get請求時,就會發生這種情況 RFC7231, Section 6.5.12
415 Unsupported Media Type 由於媒介類型不被支持,服務器不會接受請求 RFC7231, Section 6.5.13
416 Range Not Satisfiable 服務器不能滿足客戶在請求中指定的Range頭 RFC7233, Section 4.4
417 Expectation Failed 服務器不滿足請求Expect頭字段指定的期望值,如果是代理服務器,可能是下一級服務器不能滿足請求 RFC7231, Section 6.5.14
418-420 Unassigned
421 Misdirected Request 從當前客戶端所在的IP地址到服務器的連接數,超過了服務器許可的最大範圍。通常,這裏的IP地址指的是從服務器上看到的客戶端地址(比如用戶的網關或者代理服務器地址)。在這種情況下,連接數的計算可能涉及到不止一個終端用戶 RFC7540, Section 9.1.2
422 Unprocessable Entity 請求格式正確,但是由於含有語義錯誤,無法響應 RFC4918
423 Locked 當前資源被鎖定 RFC4918
424 Failed Dependency 由於之前的某個請求發生的錯誤,導致當前請求失敗,例如 PROPPATCH RFC4918
425 Too Early 請求可能會重新發起,服務器不願意冒重新處理請求的風險 RFC8470
426 Upgrade Required 客戶端應當切換到TLS/1.0 RFC7231, Section 6.5.15
427 Unassigned
428 Precondition Required 參考協議標準 RFC6585
429 Too Many Requests 參考協議標準 RFC6585
430 Unassigned
431 Request Header Fields Too Large 參考協議標準 RFC6585
432-450 Unassigned
451 Unavailable For Legal Reasons 參考協議標準 RFC7725
452-499 Unassigned
500 Internal Server Error 請求未完成。服務器內部遇到不可預知的錯誤 RFC7231, Section 6.6.1
501 Not Implemented 請求未完成。服務器不支持所請求的功能 RFC7231, Section 6.6.2
502 Bad Gateway 請求未完成。服務器從上游服務器收到一個無效的響應,或有時是爲了防止發生系統過載中斷請求,如網關層發現服務端無響應、直接熔斷 RFC7231, Section 6.6.3
503 Service Unavailable 請求未完成。服務因壓力過大或宕機導致不可用 RFC7231, Section 6.6.4
504 Gateway Timeout 網關超時,可能是網關過載、或上游服務一直未響應 RFC7231, Section 6.6.5
505 HTTP Version Not Supported 服務器不支持或拒絕支請求頭中指定的HTTP版本 RFC7231, Section 6.6.6
506 Variant Also Negotiates 由《透明內容協商協議》擴展,代表服務器存在內部配置錯誤:被請求的協商變元資源被配置爲在透明內容協商中使用自己,因此在一個協商處理中不是一個合適的重點 RFC2295
507 Insufficient Storage 參考協議標準 RFC4918
508 Loop Detected 參考協議標準 RFC5842
509 Unassigned
510 Not Extended 參考協議標準 RFC2774
511 Network Authentication Required 參考協議標準 RFC6585
512-599 Unassigned

Web應用中的用法

在Restful接口開發中,響應狀態一般固定爲200,返回內容中增加返回狀態編碼、用於標識接口運行結果。
發生錯誤時,優先使用HTTP狀態碼(如校驗未通過/會話超時爲401、沒有授權爲403),不符合標準定義的錯誤才需要自行定義編碼。

例1:status 200 body {“code”: 200, data: {}}
例2:status 200 body {“code”: 401, message: “未登錄”}


以上。感謝您的閱讀。


  1. 官方註冊表地址 ↩︎ ↩︎

  2. 百度詞條 ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章