標題皮了一下,但是內容應該算是比較用心的,不是直接抄了一下官方文件和一堆抽象的術語,盡量配合例項解釋的通俗一些。
狀態碼(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...