http狀態碼竟然可以這樣記
標題皮了一下,但是內容應該算是比較用心的,不是直接抄了一下官方文件和一堆抽象的術語,儘量配合例項解釋的通俗一些。
基本介紹
狀態碼(Status Code)和原因短語(Reason Phrase)用於簡單描述請求的結果 。常見的比如 200 OK,表示請求成功;404 not Found表示請求的資源未找到。原因短語是對狀態碼的解釋說明。
形如200
這樣的狀態碼,這裡的3位數字
中第1位數字,通常
表示響應的類別(會有特例
),完整分類參見在http1.1-RFC6
,大致可以分成以下幾類。
狀態碼 | 含義 |
---|---|
1xx | 請求正被處理 |
2xx | 請求成功處理 |
3xx | 請求需要附加操作,常見的例子如重定向 |
4xx | 客戶端出錯導致請求無法被處理 |
5xx | 服務端處理出錯 |
(4,5常被用在排查bug時前後端互相甩鍋-_-!)下面詳細介紹常用的狀態碼和原因短語
分類
2xx
200 OK
表示請求被正常處理,這個比較常見。、
204 NO Content
表示請求成功,但是響應的報文中不含實體主體。通常用於只需要客戶端向服務端傳送資訊,而不需要接受新資訊的情況使用
(這麼官方且抽象的描述顯然不是我的風格),舉例:
現在很常見的一種請求型別option
,是用來做正式請求的預請求,這個請求通常只需要確認後續的請求能不能通過,因此只需要一個結果,而不需要返回其他任何內容
,因此這類請求通常會返回204。
相信大家小時候都經常考試,其他狀態碼如果比喻為填空題
--客戶端提問(發請求),服務端返回詳細內容(答案)。
那麼204可以理解為判斷題
--客戶端提問(發請求),服務端返回對或者錯(答案)
206 Partial Content
根據字面意思可以知道,這個表示返回了部分的實體。
http的請求頭中,有一個叫做Range
,用來做範圍請求,例如:
Range:byte=5001-10000 //表示請求資源的5001-10000位元組的部分
這種情況下,如果伺服器接受範圍請求並且成功處理,就會返回206
,並且在響應的頭部返回
Content-Range:bytes 5001-10000/10000` //整個資源有10000位元組,本次返回的範圍為 5001-10000位元組
3xx
301 Moved Permanently
字面意思:資源被永久重定向了。這種情況下響應的頭部欄位Location
中一般還會返回一個地址,例如:
客戶端發起一個請求,要訪問a站點,此時收到的響應如下:
301 Moved Permanently ... Location:`b.com` ... //上述內容表示:親,您請求的資源已經永久轉移啦,這邊建議您去新的地址b.com訪問呢,以後也請直接訪問這個地址哦
302 Found
字面意思:資源臨時 重定向了。這個情況和上面的唯一區別就在於一個是臨時,一個是永久:還是上面的例子:
302 Found ... Location:`b.com` ... //上述內容表示:親,您請求的資源本次被轉移啦,當時後面還有可能再次轉移,mm這邊也不確定怕,所以這邊建議您本次去新的地址b.com訪問,以後的話還是先訪問原來地址哦,有任何變化mm依然會熱心為你解答
303 See Other
這個和302很像,但是有個細微區別是,除了會提示客戶端去請求Location
,還會順便要求要使用Get
方法去請求。 在這補充一下一個歷史背景
請求返回301 302 303 時,幾乎所有瀏覽器都會把原先的POST請求改為GET請求。雖然FRC1945和RFC2068規範中有規定:不允許客戶端在重定向時修改方法。
簡單的說,實際的瀏覽器在處理301和302時,預設就會把原先的POST請求改為GET請求,所以實際上使用303的意義單純只是讓語義化更清晰點。(303表示伺服器明確告訴客戶端,你要使用GET方法訪問location,如果是302,就是之告訴客戶端要訪問location,但是客戶端自己也會轉用GET方法訪問)
304 Not Modified
字面意思是:資源未改變,可直接使用快取。
這種響應一般是GET
請求中帶有附加條件
,例如請求頭中含有if-Match,if-Modified-Since
等(if-Match
表示帶有特殊標記的資源,if-Modified-Since
表示指定時間後未變更的資源,因為本文著重講解狀態碼,所以不引入太多http頭部的相關內容,這裡是為了簡單解釋下附加條件請求
的含義)。
這種情況下,服務端不會返回響應主體,含義就是:”從你上次訪問以來這個資源都沒變過喲,直接使用你本地的快取就行啦“。
304就是3xx裡面的一個特例,因為它不算是一個重定向。(一般我們認為重定向要給出一個新的地址讓客戶端去訪問,304如果一定要解釋為重定向,只能解釋為讓客戶端轉去訪問快取-_-)
307 Temporary Redirect
這個重定向是為了解決前面剛剛介紹的一個歷史背景問題:302
時瀏覽器預設會轉用GET
方法去請求Location
,而如果是307
, 含義就是嚴格限制不允許從POST
轉為GET
,這個目前我在實際工作中很少遇到。
4xx
4xx表示一般是客戶端發生了錯誤。(這位前端同學,乖乖接了這個bug吧!)
400 Bad Request
(這個狀態碼相信大家一定很不陌生,特別是入門的新同學~)400的含義簡單粗暴:“對不起,你的請求中有語法錯誤”,那具體是什麼語法錯誤呢? 答案是-- 不一定,一般來說響應報文裡會有一些提示,例如:
- “哎呀,你多加了什麼請求頭,我不能接受呀”
- “哎呀,你地址不是不是寫錯了,這個uri不存在啊”
- “哎呀,你是不是請求方法錯了,這個uri之只能用put而不是post”
- 下面請各位隨意補充
- ...
401 Unauthorized
字面意思:未經過認證。一般在後臺系統之類的應用裡,使用者登入之後會獲得一個身份認證資訊,然後生成mac
之類的資訊,放在請求頭的Authorization
欄位裡,傳送給服務端,如果這個認證資訊有問題或者根本沒傳送,就會出現這個狀態碼。
403 Forbidden
這個就簡單了:禁止訪問也就是無許可權訪問。至於具體為什麼禁止,伺服器可以在響應內容的實體部分給出,當然也可以不給(沒錯,我服務端就是這麼了不起,為所欲為!)
404 Not Found
很常見了,字面含義,服務端沒有找到所請求的資源,經驗表明,一般這個錯誤是客戶端的請求url寫錯了。(別問我怎麼知道的)
5xx
5xx表明服務端發生了錯誤。(真是個令人開心的訊息,老闆,你看不是我的問題!)
500 Internal Server Error
簡單粗暴,伺服器故障了。啥?你問我什麼故障?我哪知道,我只會熟練地把bug轉給隔壁的服務端同學。
503 Service Unavailable
伺服器暫時無法使用,可能是維護或者升級,反正無法使用。
小結
本文對常見的一些http狀態碼和原因做了總結,一方面希望能夠給更多入門的同學提供幫助,一方面也做一個歸納總結,方便平時排查bug時速查,文中有一部分可能涉及到了http頭部
的知識,雖然也想盡可能剝離開來,但是為了解釋說明沒法也確實完全分割開-_-。
慣例:如果內容有錯誤的地方歡迎指出(覺得看著不理解不舒服想吐槽也完全沒問題);如果有幫助,歡迎點贊和收藏,轉載請徵得同意後著明出處,如果有問題也歡迎私信交流,主頁有郵箱地址