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