HTTP協(xié)議狀態(tài)碼詳解(HTTP Status Code)
一些常見的狀態(tài)碼:
200 – 服務(wù)器成功返回網(wǎng)頁?
404 – 請(qǐng)求的網(wǎng)頁不存在?
503 – 服務(wù)不可用?
1xx(臨時(shí)響應(yīng))?表示臨時(shí)響應(yīng)并需要請(qǐng)求者繼續(xù)執(zhí)行操作的狀態(tài)代碼。
100?? (繼續(xù)) 請(qǐng)求者應(yīng)當(dāng)繼續(xù)提出請(qǐng)求仁热。服務(wù)器返回此代碼表示已收到請(qǐng)求的第一部分盏缤,正在等待其余部分漓拾。??101 ? (切換協(xié)議) 請(qǐng)求者已要求服務(wù)器切換協(xié)議人断,服務(wù)器已確認(rèn)并準(zhǔn)備切換肴捉。
2xx (成功)?
表示成功處理了請(qǐng)求的狀態(tài)代碼。
200?? (成功)? 服務(wù)器已成功處理了請(qǐng)求。通常产场,這表示服務(wù)器提供了請(qǐng)求的網(wǎng)頁。?201 ? (已創(chuàng)建)? 請(qǐng)求成功并且服務(wù)器創(chuàng)建了新的資源舞竿。?202 ? (已接受)? 服務(wù)器已接受請(qǐng)求京景,但尚未處理。?203 ? (非授權(quán)信息)? 服務(wù)器已成功處理了請(qǐng)求骗奖,但返回的信息可能來自另一來源确徙。?204 ? (無內(nèi)容)? 服務(wù)器成功處理了請(qǐng)求,但沒有返回任何內(nèi)容执桌。?205 ? (重置內(nèi)容) 服務(wù)器成功處理了請(qǐng)求鄙皇,但沒有返回任何內(nèi)容。?206 ? (部分內(nèi)容)? 服務(wù)器成功處理了部分 GET 請(qǐng)求。
3xx (重定向)?表示要完成請(qǐng)求,需要進(jìn)一步操作撬码。通常,這些狀態(tài)代碼用來重定向错蝴。
300?? (多種選擇)? 針對(duì)請(qǐng)求,服務(wù)器可執(zhí)行多種操作颓芭。服務(wù)器可根據(jù)請(qǐng)求者 (user agent) 選擇一項(xiàng)操作顷锰,或提供操作列表供請(qǐng)求者選擇。?301 ? (永久移動(dòng))? 請(qǐng)求的網(wǎng)頁已永久移動(dòng)到新位置亡问。服務(wù)器返回此響應(yīng)(對(duì) GET 或 HEAD 請(qǐng)求的響應(yīng))時(shí)官紫,會(huì)自動(dòng)將請(qǐng)求者轉(zhuǎn)到新位置。?302 ? (臨時(shí)移動(dòng))? 服務(wù)器目前從不同位置的網(wǎng)頁響應(yīng)請(qǐng)求州藕,但請(qǐng)求者應(yīng)繼續(xù)使用原有位置來進(jìn)行以后的請(qǐng)求束世。?303 ? (查看其他位置) 請(qǐng)求者應(yīng)當(dāng)對(duì)不同的位置使用單獨(dú)的 GET 請(qǐng)求來檢索響應(yīng)時(shí),服務(wù)器返回此代碼床玻。?304 ? (未修改) 自從上次請(qǐng)求后良狈,請(qǐng)求的網(wǎng)頁未修改過。服務(wù)器返回此響應(yīng)時(shí)笨枯,不會(huì)返回網(wǎng)頁內(nèi)容。?305 ? (使用代理) 請(qǐng)求者只能使用代理訪問請(qǐng)求的網(wǎng)頁遇西。如果服務(wù)器返回此響應(yīng)馅精,還表示請(qǐng)求者應(yīng)使用代理。?307 ? (臨時(shí)重定向)? 服務(wù)器目前從不同位置的網(wǎng)頁響應(yīng)請(qǐng)求粱檀,但請(qǐng)求者應(yīng)繼續(xù)使用原有位置來進(jìn)行以后的請(qǐng)求洲敢。
4xx(請(qǐng)求錯(cuò)誤)?這些狀態(tài)代碼表示請(qǐng)求可能出錯(cuò),妨礙了服務(wù)器的處理茄蚯。
400?? (錯(cuò)誤請(qǐng)求) 服務(wù)器不理解請(qǐng)求的語法压彭。?401 ? (未授權(quán)) 請(qǐng)求要求身份驗(yàn)證睦优。對(duì)于需要登錄的網(wǎng)頁,服務(wù)器可能返回此響應(yīng)壮不。?403 ? (禁止) 服務(wù)器拒絕請(qǐng)求汗盘。?404 ? (未找到) 服務(wù)器找不到請(qǐng)求的網(wǎng)頁。?405 ? (方法禁用) 禁用請(qǐng)求中指定的方法询一。?406 ? (不接受) 無法使用請(qǐng)求的內(nèi)容特性響應(yīng)請(qǐng)求的網(wǎng)頁隐孽。?407 ? (需要代理授權(quán)) 此狀態(tài)代碼與 401(未授權(quán))類似,但指定請(qǐng)求者應(yīng)當(dāng)授權(quán)使用代理健蕊。?408 ? (請(qǐng)求超時(shí))? 服務(wù)器等候請(qǐng)求時(shí)發(fā)生超時(shí)菱阵。?409 ? (沖突)? 服務(wù)器在完成請(qǐng)求時(shí)發(fā)生沖突。服務(wù)器必須在響應(yīng)中包含有關(guān)沖突的信息缩功。?410?? (已刪除)? 如果請(qǐng)求的資源已永久刪除晴及,服務(wù)器就會(huì)返回此響應(yīng)。?411 ? (需要有效長(zhǎng)度) 服務(wù)器不接受不含有效內(nèi)容長(zhǎng)度標(biāo)頭字段的請(qǐng)求嫡锌。?412 ? (未滿足前提條件) 服務(wù)器未滿足請(qǐng)求者在請(qǐng)求中設(shè)置的其中一個(gè)前提條件虑稼。?413 ? (請(qǐng)求實(shí)體過大) 服務(wù)器無法處理請(qǐng)求,因?yàn)檎?qǐng)求實(shí)體過大世舰,超出服務(wù)器的處理能力动雹。?414 ? (請(qǐng)求的 URI 過長(zhǎng)) 請(qǐng)求的 URI(通常為網(wǎng)址)過長(zhǎng),服務(wù)器無法處理跟压。?415 ? (不支持的媒體類型) 請(qǐng)求的格式不受請(qǐng)求頁面的支持胰蝠。?416 ? (請(qǐng)求范圍不符合要求) 如果頁面無法提供請(qǐng)求的范圍,則服務(wù)器會(huì)返回此狀態(tài)代碼震蒋。?417 ? (未滿足期望值) 服務(wù)器未滿足”期望”請(qǐng)求標(biāo)頭字段的要求茸塞。
5xx(服務(wù)器錯(cuò)誤)?這些狀態(tài)代碼表示服務(wù)器在嘗試處理請(qǐng)求時(shí)發(fā)生內(nèi)部錯(cuò)誤。這些錯(cuò)誤可能是服務(wù)器本身的錯(cuò)誤查剖,而不是請(qǐng)求出錯(cuò)钾虐。
500?? (服務(wù)器內(nèi)部錯(cuò)誤)? 服務(wù)器遇到錯(cuò)誤,無法完成請(qǐng)求笋庄。?501 ? (尚未實(shí)施) 服務(wù)器不具備完成請(qǐng)求的功能效扫。例如,服務(wù)器無法識(shí)別請(qǐng)求方法時(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ù)器收到請(qǐng)求摹迷。?505 ? (HTTP 版本不受支持) 服務(wù)器不支持請(qǐng)求中所用的 HTTP 協(xié)議版本疟赊。
RFC 6585 最近剛剛發(fā)布,該文檔描述了 4 個(gè)新的 HTTP 狀態(tài)碼峡碉。
HTTP 協(xié)議還在變化近哟?是的,HTTP 協(xié)議一直在演變异赫,新的狀態(tài)碼對(duì)于開發(fā) REST 服務(wù)或者說是基于 HTTP 的服務(wù)非常有用椅挣,下面我們?yōu)槟阍敿?xì)介紹這四個(gè)新的狀態(tài)碼以及是否應(yīng)該使用。
428 Precondition Required (要求先決條件)
先決條件是客戶端發(fā)送HTTP 請(qǐng)求時(shí)塔拳,如果想要請(qǐng)求能成功必須滿足一些預(yù)設(shè)的條件鼠证。
一個(gè)好的例子就是If-None-Match 頭,經(jīng)常在 GET 請(qǐng)求中使用靠抑,如果指定了 If-None-Match 量九,那么客戶端只在響應(yīng)中的 ETag 改變后才會(huì)重新接收回應(yīng)。
先決條件的另外一個(gè)例子就是If-Match 頭颂碧,這個(gè)一般用在 PUT 請(qǐng)求上用于指示只更新沒被改變的資源荠列,這在多個(gè)客戶端使用 HTTP 服務(wù)時(shí)用來防止彼此間不會(huì)覆蓋相同內(nèi)容。
當(dāng)服務(wù)器端使用428 Precondition Required?狀態(tài)碼時(shí)载城,表示客戶端必須發(fā)送上述的請(qǐng)求頭才能執(zhí)行請(qǐng)求肌似,這個(gè)方法為服務(wù)器提供一種有效的方法來阻止 'lost update' 問題。
429 Too Many Requests (太多請(qǐng)求)
當(dāng)你需要限制客戶端請(qǐng)求某個(gè)服務(wù)數(shù)量時(shí)诉瓦,該狀態(tài)碼就很有用川队,也就是請(qǐng)求速度限制。
在此之前睬澡,有一些類似的狀態(tài)碼固额,例如'509 Bandwidth Limit Exceeded'.?Twitter 使用 420?(這不是HTTP定義的狀態(tài)碼)
如果你希望限制客戶端對(duì)服務(wù)的請(qǐng)求數(shù),可使用429 狀態(tài)碼煞聪,同時(shí)包含一個(gè) Retry-After 響應(yīng)頭用于告訴客戶端多長(zhǎng)時(shí)間后可以再次請(qǐng)求服務(wù)斗躏。
431 Request Header Fields Too Large (請(qǐng)求頭字段太大)
某些情況下,客戶端發(fā)送HTTP 請(qǐng)求頭會(huì)變得很大昔脯,那么服務(wù)器可發(fā)送?431 Request Header Fields Too Large?來指明該問題啄糙。
我不太清楚為什么沒有430 狀態(tài)碼,而是直接從 429 跳到 431云稚,我嘗試搜索但沒有結(jié)果迈套。唯一的猜測(cè)是 430 Forbidden 跟 403 Forbidden 太像了,為了避免混淆才這么做的碱鳞,天知道!
511 Network Authentication Required (要求網(wǎng)絡(luò)認(rèn)證)
對(duì)我來說這個(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è)請(qǐng)求姐军,這些設(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請(qǐng)求來查找文檔(可能是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)證后才能訪問。