大家好,我是前端西瓜哥。今天我們來(lái)學(xué)習(xí) HTTP 中的常用狀態(tài)碼及使用場(chǎng)景。

作為前端,經(jīng)常需要從后端獲取數(shù)據(jù),所以對(duì) HTTP 的掌握也是很重要的。

其中 HTTP 狀態(tài)碼則代表了當(dāng)前請(qǐng)求的狀態(tài),比如客戶端還是服務(wù)端錯(cuò)誤之類的,也是考的比較多的點(diǎn)。


(資料圖片)

1xx 消息

這類狀態(tài)碼,代表請(qǐng)求已被服務(wù)端接受,但服務(wù)端還要繼續(xù)進(jìn)行處理。

100 Continue繼續(xù)。

服務(wù)端收到請(qǐng)求,并表示可以繼續(xù)。在客戶端準(zhǔn)備推送較大的數(shù)據(jù)時(shí),可以用 100 表示允許。

101 Switching Protocols切換協(xié)議。

比較常見的是響應(yīng) WebSockets 連接,瀏覽器會(huì)先發(fā)送 HTTP 請(qǐng)求,在請(qǐng)求頭里帶上希望升級(jí)為 WebSockets 協(xié)議的相關(guān)信息。

服務(wù)端收到后,如果支持 WebSockets,就會(huì)返回這個(gè)狀態(tài)碼 101,進(jìn)行 HTTP 到 WebSockets 的協(xié)議切換。

2xx 成功

這類狀態(tài)碼代表服務(wù)已被正常處理。

200 OK成功。

200 是用得最多的狀態(tài)碼,前端請(qǐng)求接口,數(shù)據(jù)正常返回,就會(huì)拿到這個(gè)狀態(tài)碼。這是大家最喜歡看到的狀態(tài)碼。

3xx 重定向

代表客戶端需要進(jìn)行進(jìn)一步操作才能完成請(qǐng)求。

301 Moved Permanently永久重定向。

請(qǐng)求的資源被永久移動(dòng)到其他位置。

假如我們的一篇博客的 url 地址發(fā)生了永久的改變,但用戶收藏夾里的鏈接還是舊的,我們就可以在用戶請(qǐng)求舊鏈接時(shí),返回 301 狀態(tài)碼,并賦上一個(gè)重定向地址。

HTTP/1.1 301 Moved PermanentlyLocation: http://www.example.org/index.asp

這樣用戶就能跳到正確的新地址中。

這新的重定向地址會(huì)被瀏覽器緩存,下次用戶訪問(wèn)舊鏈接時(shí),就不會(huì)發(fā)請(qǐng)求拿到 301,而是直接就跳到重定向地址了。

所以設(shè)置重定向地址時(shí)要小心點(diǎn),別搞錯(cuò)了。

還有一個(gè)常用用途是 HTTP 鏈接跳轉(zhuǎn)到 HTTPS 鏈接。

比如我們?cè)L問(wèn)http://zhihu.com/,就會(huì)跳轉(zhuǎn)到https://www.zhihu.com/。

302 Found臨時(shí)重定向。

原始描述短語(yǔ)為 Moved Temporarily。

適合一些臨時(shí)的重定向操作,比如因?yàn)榉?wù)器崩潰導(dǎo)致一些頁(yè)面無(wú)法提供正確的訪問(wèn),在修復(fù)期間,則可以通過(guò) 302 先暫時(shí)地重定向到一個(gè)新的地址。修復(fù)完后再讓用戶繼續(xù)訪問(wèn)原鏈接。

302 不會(huì)持久緩存,但可以設(shè)置緩存時(shí)間持續(xù)一段時(shí)間。

HTTP/1.1 302 FoundLocation: https://www-temp.example.org/Cache-control: private; max-age=600304 Not Modified沒(méi)有改變。

304 指的是資源相比上次沒(méi)有發(fā)生變化,客戶端可以繼續(xù)使用之前緩存的資源,以減輕瀏覽器負(fù)擔(dān)。

這里涉及到了 HTTP 緩存中的強(qiáng)緩存和協(xié)商緩存知識(shí)。協(xié)商緩存中會(huì)用到 304 狀態(tài)碼。

具體可以看我之前寫的一篇文章:《HTTP 緩存策略:強(qiáng)緩存和協(xié)商緩存》

4xx 客戶端錯(cuò)誤

客戶端的問(wèn)題。

400 Bad Request不好的請(qǐng)求。

通用的客戶端錯(cuò)誤,表示問(wèn)題是出在客戶端身上的。比如傳的參數(shù)不對(duì)。

在前端和后端對(duì)接接口時(shí),比較常看到這個(gè)錯(cuò)誤,因?yàn)槿菀讓戝e(cuò)參數(shù)名,或者后端新增或修改了參數(shù)。

404 Not Found不存在。

廣為人知的狀態(tài)碼,代表 url 對(duì)應(yīng)資源不存在。

比如一些文章被刪除,是直接在數(shù)據(jù)庫(kù)中進(jìn)行不可逆地徹底刪除的。然后就導(dǎo)致用戶訪問(wèn)這個(gè)頁(yè)面時(shí),服務(wù)器找不到對(duì)應(yīng)數(shù)據(jù),然后就返回一個(gè) 404,并提示 “頁(yè)面不存在”。

405 Method Not Allowed方法不被允許。

請(qǐng)求方法沒(méi)用對(duì),比如一個(gè)請(qǐng)求應(yīng)該用 POST,你卻用了 GET 請(qǐng)求,就會(huì)得到 405。

拿到 405 通常說(shuō)明你的 url 沒(méi)錯(cuò),錯(cuò)的是方法。如果 url 也不對(duì),你拿到的將是 404。

5xx服務(wù)器錯(cuò)誤

服務(wù)端的問(wèn)題,快去找后端,別老抓著前端一頓問(wèn)。

500 Internal Server Error內(nèi)部服務(wù)錯(cuò)誤。

后端服務(wù)器的代碼出了 bug,比如讀取了一個(gè) null 的屬性,就會(huì)導(dǎo)致服務(wù)無(wú)法正常運(yùn)行下去,然后后端就會(huì)捕獲(catch)這個(gè)錯(cuò)誤,返回 500,告知是后端服務(wù)器出了問(wèn)題。

嚴(yán)重的情況下,后端服務(wù)直接崩潰。

502 Bad Gateway網(wǎng)關(guān)錯(cuò)誤。

比如后端服務(wù)崩潰,但中間的一些代理服務(wù)器 Web Server(比如 Ngnix)還能正確運(yùn)行。但因?yàn)闊o(wú)法訪問(wèn)到后端服務(wù),所以就會(huì)返回一個(gè) 502。

504 Gateway Timout網(wǎng)關(guān)超時(shí)。

網(wǎng)關(guān)還在,但后端服務(wù)因?yàn)楦鞣N原因(比如因?yàn)橐粋€(gè)死循環(huán)卡死了),導(dǎo)致一直沒(méi)有響應(yīng)回來(lái),在過(guò)了一段時(shí)間后網(wǎng)關(guān)了依舊沒(méi)能收到消息,就會(huì)給客戶端返回 504 網(wǎng)關(guān)超時(shí)。

結(jié)尾

常見的 HTTP 狀態(tài)碼大概就是這些。

標(biāo)簽: HTTP 常用狀態(tài)碼