1xx(臨時響應(yīng))
表示臨時響應(yīng)并需要請求者繼續(xù)執(zhí)行操作的狀態(tài)代碼。
| 代碼 | 說明 |
|---|---|
| 100 | (繼續(xù)) 請求者應(yīng)當(dāng)繼續(xù)提出請求。 服務(wù)器返回此代碼表示已收到請求的第一部分,正在等待其余部分。 |
| 101 | (切換協(xié)議) 請求者已要求服務(wù)器切換協(xié)議,服務(wù)器已確認(rèn)并準(zhǔn)備切換。 |
2xx (成功)
表示成功處理了請求的狀態(tài)代碼。
| 代碼 | 說明 |
|---|---|
| 200 | (成功) 服務(wù)器已成功處理了請求。 通常,這表示服務(wù)器提供了請求的網(wǎng)頁。 |
| 201 | (已創(chuàng)建) 請求成功并且服務(wù)器創(chuàng)建了新的資源。 |
| 202 | (已接受) 服務(wù)器已接受請求,但尚未處理。 |
| 203 | (非授權(quán)信息) 服務(wù)器已成功處理了請求,但返回的信息可能來自另一來源。 |
| 204 | (無內(nèi)容) 服務(wù)器成功處理了請求,但沒有返回任何內(nèi)容。 |
| 205 | (重置內(nèi)容) 服務(wù)器成功處理了請求,但沒有返回任何內(nèi)容。 |
| 206 | (部分內(nèi)容) 服務(wù)器成功處理了部分 GET 請求 |
3xx (重定向)
表示要完成請求,需要進(jìn)一步操作。 通常,這些狀態(tài)代碼用來重定向。
| 代碼 | 說明 |
|---|---|
| 300 | (多種選擇) 針對請求,服務(wù)器可執(zhí)行多種操作。 服務(wù)器可根據(jù)請求者 (user agent) 選擇一項(xiàng)操作,或提供操作列表供請求者選擇。 |
| 301 | (永久移動) 請求的網(wǎng)頁已永久移動到新位置。 服務(wù)器返回此響應(yīng)(對 GET 或 HEAD 請求的響應(yīng))時,會自動將請求者轉(zhuǎn)到新位置。 |
| 302 | (臨時移動) 服務(wù)器目前從不同位置的網(wǎng)頁響應(yīng)請求,但請求者應(yīng)繼續(xù)使用原有位置來進(jìn)行以后的請求。 |
| 303 | (查看其他位置) 請求者應(yīng)當(dāng)對不同的位置使用單獨(dú)的 GET 請求來檢索響應(yīng)時,服務(wù)器返回此代碼。 |
| 304 | (未修改) 自從上次請求后,請求的網(wǎng)頁未修改過。 服務(wù)器返回此響應(yīng)時,不會返回網(wǎng)頁內(nèi)容。 |
| 305 | (使用代理) 請求者只能使用代理訪問請求的網(wǎng)頁。 如果服務(wù)器返回此響應(yīng),還表示請求者應(yīng)使用代理。 |
| 307 | (臨時重定向) 服務(wù)器目前從不同位置的網(wǎng)頁響應(yīng)請求,但請求者應(yīng)繼續(xù)使用原有位置來進(jìn)行以后的請求 |
4xx(請求錯誤)
這些狀態(tài)代碼表示請求可能出錯,妨礙了服務(wù)器的處理。
| 代碼 | 說明 |
|---|---|
| 400 | (錯誤請求) 服務(wù)器不理解請求的語法。 |
| 401 | (未授權(quán)) 請求要求身份驗(yàn)證。 對于需要登錄的網(wǎng)頁,服務(wù)器可能返回此響應(yīng)。 |
| 403 | (禁止) 服務(wù)器拒絕請求。 |
| 404 | (未找到) 服務(wù)器找不到請求的網(wǎng)頁。 |
| 405 | (方法禁用) 禁用請求中指定的方法。 |
| 406 | (不接受) 無法使用請求的內(nèi)容特性響應(yīng)請求的網(wǎng)頁。 |
| 407 | (需要代理授權(quán)) 此狀態(tài)代碼與 401(未授權(quán))類似,但指定請求者應(yīng)當(dāng)授權(quán)使用代理。 |
| 408 | (請求超時) 服務(wù)器等候請求時發(fā)生超時。 |
| 409 | (沖突) 服務(wù)器在完成請求時發(fā)生沖突。 服務(wù)器必須在響應(yīng)中包含有關(guān)沖突的信息。 |
| 410 | (已刪除) 如果請求的資源已永久刪除,服務(wù)器就會返回此響應(yīng)。 |
| 411 | (需要有效長度) 服務(wù)器不接受不含有效內(nèi)容長度標(biāo)頭字段的請求。 |
| 412 | (未滿足前提條件) 服務(wù)器未滿足請求者在請求中設(shè)置的其中一個前提條件。 |
| 413 | (請求實(shí)體過大) 服務(wù)器無法處理請求,因?yàn)檎埱髮?shí)體過大,超出服務(wù)器的處理能力。 |
| 414 | (請求的 URI 過長) 請求的 URI(通常為網(wǎng)址)過長,服務(wù)器無法處理。 |
| 415 | (不支持的媒體類型) 請求的格式不受請求頁面的支持。 |
| 416 | (請求范圍不符合要求) 如果頁面無法提供請求的范圍,則服務(wù)器會返回此狀態(tài)代碼。 |
| 417 | (未滿足期望值) 服務(wù)器未滿足”期望”請求標(biāo)頭字段的要求 |
5xx(服務(wù)器錯誤)
這些狀態(tài)代碼表示服務(wù)器在嘗試處理請求時發(fā)生內(nèi)部錯誤。 這些錯誤可能是服務(wù)器本身的錯誤,而不是請求出錯。
| 代碼 | 說明 |
|---|---|
| 500 | (服務(wù)器內(nèi)部錯誤) 服務(wù)器遇到錯誤,無法完成請求。 |
| 501 | (尚未實(shí)施) 服務(wù)器不具備完成請求的功能。 例如,服務(wù)器無法識別請求方法時可能會返回此代碼。 |
| 502 | (錯誤網(wǎng)關(guān)) 服務(wù)器作為網(wǎng)關(guān)或代理,從上游服務(wù)器收到無效響應(yīng)。 |
| 503 | (服務(wù)不可用) 服務(wù)器目前無法使用(由于超載或停機(jī)維護(hù))。 通常,這只是暫時狀態(tài)。 |
| 504 | (網(wǎng)關(guān)超時) 服務(wù)器作為網(wǎng)關(guān)或代理,但是沒有及時從上游服務(wù)器收到請求。 |
| 505 | (HTTP 版本不受支持) 服務(wù)器不支持請求中所用的 HTTP 協(xié)議版本 |
RFC 6585 最近剛剛發(fā)布,該文檔描述了 4 個新的 HTTP 狀態(tài)碼。
HTTP 協(xié)議還在變化?是的,HTTP 協(xié)議一直在演變,新的狀態(tài)碼對于開發(fā) REST 服務(wù)或者說是基于 HTTP 的服務(wù)非常有用,下面我們?yōu)槟阍敿?xì)介紹這四個新的狀態(tài)碼以及是否應(yīng)該使用。
428 Precondition Required (要求先決條件)
先決條件是客戶端發(fā)送 HTTP 請求時,如果想要請求能成功必須滿足一些預(yù)設(shè)的條件。
一個好的例子就是 If-None-Match 頭,經(jīng)常在 GET 請求中使用,如果指定了 If-None-Match ,那么客戶端只在響應(yīng)中的 ETag 改變后才會重新接收回應(yīng)。
先決條件的另外一個例子就是 If-Match 頭,這個一般用在 PUT 請求上用于指示只更新沒被改變的資源,這在多個客戶端使用 HTTP 服務(wù)時用來防止彼此間不會覆蓋相同內(nèi)容。
當(dāng)服務(wù)器端使用 428 Precondition Required 狀態(tài)碼時,表示客戶端必須發(fā)送上述的請求頭才能執(zhí)行請求,這個方法為服務(wù)器提供一種有效的方法來阻止 ‘lost update’ 問題。
429 Too Many Requests (太多請求)
當(dāng)你需要限制客戶端請求某個服務(wù)數(shù)量時,該狀態(tài)碼就很有用,也就是請求速度限制。
在此之前,有一些類似的狀態(tài)碼,例如 ‘509 Bandwidth Limit Exceeded’. Twitter 使用 420 (這不是HTTP定義的狀態(tài)碼)
如果你希望限制客戶端對服務(wù)的請求數(shù),可使用 429 狀態(tài)碼,同時包含一個 Retry-After 響應(yīng)頭用于告訴客戶端多長時間后可以再次請求服務(wù)。
431 Request Header Fields Too Large (請求頭字段太大)
某些情況下,客戶端發(fā)送 HTTP 請求頭會變得很大,那么服務(wù)器可發(fā)送 431 Request Header Fields Too Large 來指明該問題。
我不太清楚為什么沒有 430 狀態(tài)碼,而是直接從 429 跳到 431,我嘗試搜索但沒有結(jié)果。唯一的猜測是 430 Forbidden 跟 403 Forbidden 太像了,為了避免混淆才這么做的,天知道!
511 Network Authentication Required (要求網(wǎng)絡(luò)認(rèn)證)
對我來說這個狀態(tài)碼很有趣,如果你在開發(fā)一個 HTTP 服務(wù)器,你不一定需要處理該狀態(tài)碼,但如果你在編寫 HTTP 客戶端,那這個狀態(tài)碼就非常重要。
如果你頻繁使用筆記本和智能手機(jī),你可能會注意到大量的公用 WIFI 服務(wù)要求你必須接受一些協(xié)議或者必須登錄后才能使用。
這是通過攔截HTTP流量,當(dāng)用戶試圖訪問網(wǎng)絡(luò)返回一個重定向和登錄,這很討厭,但是實(shí)際情況就是這樣的。
使用這些“攔截”客戶端,會有一些討厭的副作用。在 RFC 中有提到這兩個的例子:
如果你在登錄WIFI前訪問某個網(wǎng)站,網(wǎng)絡(luò)設(shè)備將會攔截首個請求,這些設(shè)備往往也有自己的網(wǎng)站圖標(biāo) ‘favicon.ico’。登錄后您會發(fā)現(xiàn),有一段時間內(nèi)你訪問的網(wǎng)站圖標(biāo)一直是WIFI登錄網(wǎng)站的圖標(biāo)。
如果客戶端使用HTTP請求來查找文檔(可能是JSON),網(wǎng)絡(luò)將會響應(yīng)一個登錄頁,這樣你的客戶端就會解析錯誤并導(dǎo)致客戶端運(yùn)行異常,在現(xiàn)實(shí)中這種問題非常常見。
因此 511 狀態(tài)碼的提出就是為了解決這個問題。
如果你正在編寫 HTTP 的客戶端,你最好還是檢查 511 狀態(tài)碼以確認(rèn)是否需要認(rèn)證后才能訪問。