這可能是全網最全的HTTP狀態碼解釋,強烈建議您收藏。
在前後端開發、服務器運維等場景中,經常需要處理網絡請求。瞭解HTTP狀態碼,可以快速判斷常見問題。
簡介
定義
HTTP狀態碼(HTTP Status Code)是表示網頁服務器超文本傳輸協議響應狀態的3位數字代碼。
作用過程
HTTP協議中,客戶端發出請求連接、服務端建立連接,客戶端發出HTTP請求,服務端返回響應信息。
而在這個過程中,由於客戶端或服務端的問題會返回相應的錯誤代碼,不同代碼表示不同的信息,客戶端可以根據編碼、調整相應的操作來修改出現的錯誤,最終避免錯誤的再現。
下圖是簡化的交互過程,忽略了網絡握手等細節。
五種分類
所有狀態碼的第一個數字,代表了響應的五種狀態。
- 最常見的是成功類即
2xx
,其中最常用的是200
- 其次是客戶端錯誤
4xx
和服務端錯誤5xx
1xx
和3xx
一般瀏覽器會自動處理、用戶感知不強,所以不常見
狀態碼 | 描述 | 解釋 |
---|---|---|
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: “未登錄”}
以上。感謝您的閱讀。