http狀態碼居然能夠這樣記

標題皮了一下,可是內容應該算是比較用心的,不是直接抄了一下官方文檔和一堆抽象的術語,儘可能配合實例解釋的通俗一些。html

基本介紹

狀態碼(Status Code)和緣由短語(Reason Phrase)用於簡單描述請求的結果。常見的好比:前端

  • 200 OK,表示請求成功;
  • 404 Not Found表示請求的資源未找到。

緣由短語(上面的ok 和Not Found)是對狀態碼的解釋說明。nginx

形如200這樣的狀態碼,這裏的3位數字中第1位數字,一般表示響應的類別(會有一兩個例外),大體能夠分紅如下幾類(完整的狀態碼錶,參見http1.1-RFC6):segmentfault

狀態碼 含義
1xx 請求正被處理
2xx 請求成功處理
3xx 請求須要附加操做,常見的例子如重定向
4xx 客戶端出錯致使請求沒法被處理
5xx 服務端處理出錯

(4,5常被用在排查bug時先後端互相甩鍋-_-!)下面詳細介紹經常使用的狀態碼和緣由短語windows

分類

2xx

200 OK

表示請求已經被正常處理,這個比較常見,就很少說了。後端

204 NO Content

表示請求成功,可是響應的報文中不含實體主體。一般用於只須要客戶端向服務端發送信息,而不須要接受新信息的狀況使用

(這麼官方且抽象的描述顯然不是個人風格),舉例:瀏覽器

如今很常見的一種請求類型option,一般被用來作正式請求的預請求,這個請求只須要確認後續的請求能不能經過,即只須要一個結果,而不須要返回其餘內容,這類請求成功時就會返回204。緩存

相信你們小時候都常常考試,若是拿試題來打個比方,那麼:服務器

  • 其餘狀態碼能夠比喻爲填空題:客戶端提問(發請求),服務端給出詳細答案(返回實體內容)。
  • 204能夠理解爲判斷題:客戶端提問(發請求),服務端給出判斷,對或者錯(只要響應頭有狀態碼,不須要實體內容)

206 Partial Content

字面意思:只返回了請求資源的部分。這種狀況必須提到提到一個請求頭Range——在http的請求中,這個頭部用來表示範圍請求,例如:post

'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

字面意思:資源臨時重定向了。和301的惟一區別就在於一個是臨時,一個是永久:仍是舉上面的例子,響應以下:

302 Found
...
Location:`b.com`
...
//上述內容表示:親,您請求的資源被臨時轉移啦,後面也有可能再次轉移,因此這邊建議您本次去新的地址b.com訪問,之後的話仍是先訪問原來地址哦,有任何變化mm依然會熱心爲你解答

303 See Other

這個和302很像,可是有個細微區別是,除了會提示客戶端去請求Location之外,還會要求請求要使用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轉給隔壁的服務端同窗。

評論區有讀者提到漏掉了502和504,想一想仍是補上吧,雖然要說明這倆還得稍微解釋下網關和代理(懶性暴露),可是平時開發的時候確實也常常出現,尤爲是使用nginx進行調試的時候。順便安利一下教程 windows下使用nginx調試

502 Bad Gateway

做爲網關或者代理工做的服務器嘗試執行請求時,從上游服務器接收到無效的響應。這裏說明下網關和代理服務器的概念:前面咱們舉例子都是直接客戶端向服務器發請求,實際上客戶端有時候不是直接向服務器請求,這中間可能存在網關和代理。畫個簡單的圖:
圖片描述

圖片描述

503 Service Unavailable

服務器暫時沒法使用,多是維護或者升級,反正沒法使用。

504 Gateway Timeout

做爲網關或者代理工做的服務器訪問超時。

小結

本文對常見的一些http狀態碼和緣由作了總結,一方面但願可以給更多入門的同窗提供幫助,一方面也作一個概括總結,方便平時排查bug時速查,文中有一部分可能涉及到了http頭部的知識,雖然也想盡量剝離開來,可是爲了解釋說明無法也確實徹底分割開-_-。


慣例:若是內容有錯誤的地方歡迎指出(以爲看着不理解不舒服想吐槽也徹底沒問題);若是有幫助,歡迎點贊和收藏,轉載請徵得贊成後著明出處,若是有問題也歡迎私信交流,主頁有郵箱地址

相關文章
相關標籤/搜索