http狀態碼竟然可以這樣記

2021-09-12 15:43:18 字數 3340 閱讀 3722

標題皮了一下,但是內容應該算是比較用心的,不是直接抄了一下官方文件和一堆抽象的術語,盡量配合例項解釋的通俗一些。

狀態碼(status code)和原因短語(reason phrase)用於簡單描述請求的結果。常見的比如:

原因短語(上面的ok 和not found)是對狀態碼的解釋說明。

形如200這樣的狀態碼,這裡的3位數字中第1位數字,通常表示響應的類別(會有一兩個例外),大致可以分成以下幾類(完整的狀態碼表,參見http1.1-rfc6):

狀態碼含義

1xx請求正被處理

2xx請求成功處理

3xx請求需要附加操作,常見的例子如重定向

4xx客戶端出錯導致請求無法被處理

5xx服務端處理出錯

(4,5常被用在排查bug時前後端互相甩鍋-_-!)下面詳細介紹常用的狀態碼和原因短語

表示請求已經被正常處理,這個比較常見,就不多說了。

表示請求成功,但是響應的報文中不含實體主體。通常用於只需要客戶端向服務端傳送資訊,而不需要接受新資訊的情況使用
(這麼官方且抽象的描述顯然不是我的風格),舉例:

現在很常見的一種請求型別option,通常被用來做正式請求的預請求,這個請求只需要確認後續的請求能不能通過,即只需要乙個結果,而不需要返回其他內容,這類請求成功時就會返回204。

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

'range':byte=5001-10000 // 表示本次要請求資源的5001-10000位元組的部分
這種情況下,如果伺服器接受範圍請求並且成功處理,就會返回206,並且在響應的頭部返回

'content-range':bytes 5001-10000/10000 // 表示整個資源有10000位元組,本次返回的範圍為 5001-10000位元組
字面意思:資源被永久重定向了。這種情況下響應的頭部字段location中一般還會返回乙個位址,用來表示要新位址。例如:

客戶端發起乙個請求,要訪問a站點,此時收到的響應如下:

301 moved permanently 

...location:`b.com`

...

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

302 found

...location:`b.com`

...

這個和302很像,但是有個細微區別是,除了會提示客戶端去請求location以外,還會要求請求要使用location時使用get方法。 在這補充一下乙個歷史背景:

請求返回301 302 303 時,幾乎所有瀏覽器都會把原先的post請求改為get請求。雖然frc1945和rfc2068規範中有規定:不允許客戶端在重定向時修改方法。
簡單的說,實際的瀏覽器在處理301和302時,預設就會把原先的post請求改為get請求,所以實際上使用303的意義,單純只是讓語義化更清晰點。(303表示伺服器明確告訴客戶端,你要使用get方法訪問location;如果是302,就是僅僅告訴客戶端要訪問location,不限制方法,但是實際上客戶端自己也會用get方法訪問。)

字面意思是:資源未改變,可直接使用快取。

這種情況下,服務端不會返回響應主體,含義就是:」從你上次訪問以來這個資源都沒變過喲,直接使用你本地的快取就行啦「。

304就是3xx裡面的乙個特例,因為它不算是乙個重定向。(一般我們認為重定向要給出乙個新的位址讓客戶端去訪問,304如果一定要解釋為重定向,只能解釋為讓客戶端轉去訪問快取-_-)

這個重定向是為了解決前面剛剛介紹的乙個歷史背景問題:302時瀏覽器缺省會轉用get方法去請求location,而如果是307, 含義就是嚴格限制不允許從post轉為get,這個目前我在實際工作中很少遇到。

4xx表示一般是客戶端發生了錯誤。(這位前端同學,乖乖接了這個bug吧!)

(這個狀態碼相信大家一定很不陌生,特別是入門的新同學~)400的含義簡單粗暴:「對不起,你的請求中有語法錯誤」,那具體是什麼語法錯誤呢? 答案是 —— 不一定,一般來說響應報文裡會有一些提示,例如:

字面意思:未經過認證。一般在後台系統之類的應用裡,使用者登入之後會獲得乙個身份認證資訊,然後生成mac之類的資訊,放在請求頭的authorization欄位裡,傳送給服務端,如果這個認證資訊有問題或者根本沒傳送,就會出現這個狀態碼。

這個就簡單了:禁止訪問也就是無許可權訪問。至於具體為什麼禁止,伺服器可以在響應內容的實體部分給出,當然也可以不給(沒錯,我服務端就是這麼了不起,為所欲為!)

很常見了,字面含義,服務端沒有找到所請求的資源,經驗表明,一般這個錯誤是客戶端的請求url寫錯了。(別問我怎麼知道的)

5xx表明服務端發生了錯誤。(真是個令人開心的訊息,老闆,你看不是我的問題!)

簡單粗暴,伺服器故障了。啥?你問我什麼故障?我哪知道,我只會熟練地把bug轉給隔壁的服務端同學。

作為閘道器或者**工作的伺服器嘗試執行請求時,從上游伺服器接收到無效的響應。這裡說明下閘道器和**伺服器的概念:前面我們舉例子都是直接客戶端向伺服器發請求,實際上客戶端有時候不是直接向伺服器請求,這中間可能存在閘道器和**。畫個簡單的圖:

伺服器暫時無法使用,可能是維護或者公升級,反正無法使用。

作為閘道器或者**工作的伺服器訪問超時。

302狀態碼 小結HTTP狀態碼

作為乙個web開發工程師,我們平時都會和諸如200,304,404,501等狀態碼打交道,那麼它們是什麼意思呢?今天,我們來聊聊 http狀態碼是服務端返回給客戶端 因為這裡是web開發,這裡的客戶端指瀏覽器客戶端 的3位數字 這些狀態碼相當於瀏覽器和伺服器之間的對話資訊。它們相互溝通兩者之間的事情...

狀態碼202 HTTP狀態碼

當瀏覽者訪問乙個網頁時,瀏覽者的瀏覽器會向網頁所在伺服器發出請求。當瀏覽器接收並顯示網頁前,此網頁所在的伺服器會返回乙個包含http狀態碼的資訊頭 server header 用以響應瀏覽器的請求。http狀態碼的英文為http status code。下面是常見的http狀態碼 狀態碼詳細介紹說明...

記遇到過的HTTP狀態碼(Status Code

200 ok 請求成功,聯調時傳送引數符合介面想要接收的引數 302 move temporarity 重定向,後端介面更新時顯示,部署預發環境等情況,重定向是臨時的 請求的資源臨時從不同的 uri響應請求。由於這樣的重定向是臨時的,客戶端應當繼續向原有位址傳送以後的請求。只有在cache cont...