前言
404 — 對於普通人來說,它是“四百零四”,是一個用十進位制表示的數字,但對於開發者,尤其是web相關的開發者來說,它指相關資源沒找到,表示了一種“不存在”的意思,如果我要隱含的表示我的某個東西不見了,我可以說“我的東西404了”(它的設計哲學中隱藏著加密學和壓縮學)。在HTTP架構體系中,狀態碼是很重要的一環,它用各種協商好的數字字元來指代客戶端和服務端在通訊時遇到的各種情況,在前後端分離的當前環境下,前後端處於分離狀態,瞭解各狀態碼的指代含義對於加快開發進度和除錯進度意義重大。
各狀態碼解列
一、1xx:資訊響應( Informational response)
簡介:表示響應已被服務端接收、理解,但還需做進一步處理,該型別狀態碼往往是臨時性的,因為馬上將會變為以下狀態之一:成功(2xx)、重定向(3xx)、異常或錯誤(4xx或5xx)
二、2XX:請求成功(Success)
簡介:表示客戶端傳送的請求已成功被服務端接收、理解、接受
- 200 成功(ok):標準的HTTP請求響應成功狀態碼,get請求中,響應將包含與請求對應的實體,post請求中,響應將包含實體的描述或實體的操作結果。
- 202 已接受請求(Accepted):服務端接受了請求,但還沒處理,最終可能會成功、或不會被執行或禁止執行
- 204 無內容(No Content):服務端成功處理了請求,但沒返回任何內容
- 205 重置內容(Reset Content):服務端成功處理了請求,但沒返回任何內容,區別於204的是:該響應要求客戶端重置文件檢視。
- 206 部分內容(Partial Content):服務端成功處理了請求的部分內容,該狀態碼一般用於HTTP下載工具的斷點續傳功能或多個下載的分段進行(如迅雷下載)
三、3XX:重定向(Redirection)
簡介:表示客戶端需要採取進一步的操作才能完成請求,該狀態碼常用於URL重定向,後續的請求地址在本次響應的Location域中指明
- 301 永久移動(Moved Permanently):被請求資源已被永久的轉移到新位置,並且將來對此資源的引用都應該使用它返回的URI之一,新的永久性URI將在Location域中返回。永遠也別來煩我,去找張三吧。
- 302 臨時移動(Found,原始短語為Moved Temporarily):由於移動式臨時的,客戶端以後還是用原來的地址傳送請求,新的臨時URI將在Location域中返回
- 303 看其它(See Other):請求的地址已經被移動,請求的對應地址可以在另一個URI上被找到
- 304 未修改(Not Modified):表示當前資源的版本在根據請求頭的If-Modified-Since和If-None-Match引數判斷快取後,資源未曾被修改,這樣客戶端不需要重新傳新資源,客戶端仍然使用上次下載的資源復件。
四、4XX:客戶端錯誤(Client errors),
簡介:表示錯誤情況可能是由客戶端導致的,除非是一個HEAD請求,否則伺服器應該把錯誤請求的詳細解釋實體丟擲來闡述錯誤情況,這個錯誤資訊應該告訴是臨時的還是永久狀況,該狀態碼適用於任何請求方法。客戶端應該儘可能把錯誤實體展示給使用者。
- 400 錯誤請求(Bad Request):明顯的客戶端錯誤請求(如:語法缺陷,請求包過大、無效的請求訊息片段、欺詐性請求路由)
- 401 未授權(Unauthorized):類似於403 Forbidden錯誤,但不同的是該錯誤是指在特定的認證情況下,使用者未能通過認證(如:登陸認證)
- 403 已拒絕(Forbidden):該請求已被伺服器驗證為有效,但是伺服器拒絕了它的操作,一般是因為使用者沒有取得對應資源的使用權。
- 404 未找到(Not Found)
- 405 方法不被允許(Method Not Allowed):該請求方法不支援對需請求資源的訪問。如:明明是需要post方法的,你卻給我傳了個get方法
- 406 請求無法接受(Not Acceptable):請求資源的內容格式無法滿足請求頭中的要求,因而無法生成響應體,故無法接受,請求的格式由Content-type頭重定義的媒體型別決定
- 408 請求超時(Request Timeout):客戶端沒有在伺服器預備等待的時間內完成一個請求的傳送,客戶端可以隨時再次提交這一請求而無需進行任何更改。
- 409 衝突(Confict):因為請求存在衝突無法處理,比如多人線上編輯工具出現的衝突
五、5XX:伺服器錯誤(Server errors)
簡介:表示服務端無法完成請求,該狀態表示服務端在處理請求的過程中發生了錯誤或異常
- 500 內部服務錯誤(Internal Server Error):通用錯誤訊息,服務端遇到了一個未曾預料的情況(如:服務端可能沒有使用try catch等錯誤處理機制來抓到並處理錯誤異常),無法給出更具體的錯誤訊息來解釋 —— 我的錯,但我不知道我錯哪了
- 501 請求無法實現(Not implemented):服務端不支援當前請求中所需的某個功能—— 臣妾做不到啊!
- 502 損壞的閘道器(Bad Gateway):作為閘道器或代理工作的服務端嘗試執行請求時,從上游伺服器接收到無效的響應。
- 503 服務不可用(Service Unavailable):由於臨時的請求過載,導致服務端無法處理請求,該狀況只是暫時的,並且會在一段時間後恢復,如果能預計延遲時間,那麼響應中包含一個Retry-After頭來標明延遲時間
附加知識點:
- Head方法:它與get方法幾乎一樣,但該方法只請求資源的頭部資訊(頭部資訊和get方法的頭部資訊一樣),不會請求響應實體部分(即使包含了也會被忽略),因為head方法的該特性,我們可以利用它測試、獲取到對應資源的相關“摘要資訊”,來決定採取的步驟,一個使用場景是在下載一個大檔案時先獲取其大小,再考慮是否下載它。—— 它是一個觸手試探器,就像一個偵察兵一樣
後記
就我個人的理解,對於大部分開發者來說,瞭解常用的狀態碼,有一個狀態碼的框架圖足以,如果發現了錯誤自己不清楚的上wiki或w3c找即可,不需要死記硬背,但它還是很重要的,所以需要在日常開發中多多關注一些狀態碼指代的隱含意思,就像你不知道“2333”這個詞語無法混二次元圈子一樣,瞭解狀態碼也是一種混圈子的基礎裝逼屬性。