本文從如下幾個方面,按部就班走進 HTTP 狀態碼前端
HTTP 狀態行中使用狀態碼(Status Code)和緣由短語(Reason Phrase)來簡單描述請求的結果git
這裏咱們重點介紹狀態碼,狀態碼是用以表示 HTTP 響應狀態的 3 位數字代碼,由RFC 2616規範定義。 合理的狀態碼不只可讓用戶或者瀏覽器作出更加合適的進一步操做(例如繼續發送請求、切換協議,重定向跳轉等),並且可讓客戶端代碼更加易於理解和維護 。github
RFC 把狀態碼分紅五類,分別是:web
1xx 是很陌生的,表明請求已被接受,須要繼續處理。這類響應是臨時響應,標示客戶應該等待服務器採起進一步行動。面試
咱們最多見的是 101(Switching Protocols)算法
服務器已經理解了客戶端的請求,並根據 Upgrade 消息頭切換協議。瀏覽器
在 http header怎麼判斷協議是否是websocket 咱們提到過,http 發送請求給服務器,服務器經過判斷 header 中是否包含 Connection: Upgrade
與 Upgrade: websocket
來判斷當前協議是否要升級到 websocket ,若是服務器贊成進行 WebSocket 鏈接時,返回響應碼 101
緩存
表示請求已成功被服務器接收、理解、並接受服務器
常見的有websocket
最多見的,表示請求成功
與 200 基本相同,但響應頭後沒有 body 數據
分片傳輸,每次只返回了請求資源的 部分 ,經常使用於實現斷點續傳或者將一個大文檔分解爲多個下載段同時下載
請求頭中包含 Range
字段時,響應須要只返回 Range
指定的那一段。響應中應包含 Content-Range
來指示返回內容的範圍
例如:
'Range':byte=5001-10000
// 表示本次要請求資源的5001-10000字節的部分
複製代碼
這種狀況下,若是服務器接受範圍請求而且成功處理,就會返回 206
,而且在響應的頭部返回
'Content-Range':bytes 5001-10000/10000
// 表示整個資源有10000字節,本次返回的範圍爲 5001-10000字節
複製代碼
這類狀態碼錶明須要客戶端採起進一步的操做才能完成請求。一般,這些狀態碼用來重定向, 重定向目標在本次響應的 Location
頭字段中指明
主要有如下 9 種狀態碼:
狀態碼 | 狀態短語 | 狀態含義 |
---|---|---|
300 | Multiple Choices | 當請求的 URL 對應有多個資源時(如同一個 HTML 的不一樣語言的版本),返回這個代碼時,能夠返回一個可選列表,這樣用戶能夠自行選擇。經過 Location 頭字段能夠自定首選內容。 |
301 | Moved Permanetly | 當前請求的資源已被移除時使用,響應的 Location 頭字段會提供資源如今的 URL。直接使用 GET 方法發起新情求。 |
302 | Found | 與 301 相似,但客戶端只應該將 Location 返回的 URL 當作臨時資源來使用,未來請求時,仍是用老的 URL。直接使用 GET 方法發起新情求。 |
303 | See Other | 用於在 PUT 或者 POST 請求以後進行重定向,這樣在結果頁就不會再次觸發重定向了。 |
304 | Not Modified | 資源未修改,表示本地緩存仍然可用。 產生這個狀態的前提是:客戶端本地已經有緩存的版本,而且在 Request 中告訴了服務端,當服務端經過時間或者 Etag,發現沒有更新的時候,就會返回一個不含 body 的 304 狀態 |
305 | Use Proxy | 用來表示必須經過一個代理來訪問資源,代理的位置有 Location 頭字段給出 |
306 | Switch Proxy | 在最新版的規範中,306 狀態碼已經再也不被使用。最初是指「後續請求應使用指定的代理」。 |
307 | Temporary Redirect | 與 302 相似,可是使用原請求方法發起新情求。 |
308 | Permanent Redirect | 與 301 相似,可是使用原請求方法發起新情求。 |
這 9 種狀態碼能夠分紅 3 大類,分別是:永久重定向、臨時重定向以及特殊重定向
301 和 308 都屬於永久重定向,301 原本在規範中是不容許重定向時改變請求方法的(將POST改成GET),可是許多瀏覽器卻容許重定向時改變請求方法(這是一種不規範的實現)
308 的出現也是給上面的行爲作個規範,不過是不容許重定向時改變請求方法。
Permanent | Temporary | |
---|---|---|
Allows changing the request method from POST to GET. | 301 | 302 |
Does not allow changing the request method from POST to GET. | 308 | 307 |
30二、30三、307 都屬於臨時重定向,臨時是指訪問的資源可能暫時先用location的URI訪問,但舊資源還在的,下次你再來訪問的時候可能就不用重定向了
302 和 307 的關係相似於 301 和 308,303一般用來在建立、修改和刪除時展現臨時的進度頁
除此以外,300/304/305/306 能夠歸屬到特殊重定向類。這裏重點說一下 304,304 是 HTTP 緩存中的一個重要內容,表示資源未修改,至關於將資源重定向到本地緩存。
304 又是一個每一個前端必知必會的狀態,產生這個狀態的前提是:客戶端本地已經有緩存的版本,而且在 Request 中告訴了服務端,當服務端經過時間或者 Etag,發現沒有更新的時候,就會返回一個不含 body 的 304 狀態
表示客戶端發送的請求報文有誤,服務器沒法處理,它就是真正的「錯誤碼」含義了
因爲明顯的客戶端錯誤(例如,格式錯誤的請求語法,太大的大小,無效的請求消息或欺騙性路由請求),服務器不能或不會處理該請求
表示服務器禁止訪問資源。緣由可能多種多樣,例如信息敏感、法律禁止等,若是服務器友好一點,能夠在 body 裏詳細說明拒絕請求的緣由,不過現實中一般都是直接給一個「閉門羹」
請求失敗,請求所但願獲得的資源未在服務器上發現,但容許用戶的後續請求。
服務器錯誤,服務器在處理請求時內部發生了錯誤
通用錯誤消息,服務器遇到了一個不曾預料的情況,致使了它沒法完成對請求的處理。沒有給出具體錯誤信息。
服務器不支持當前請求所須要的某個功能。當服務器沒法識別請求的方法,而且沒法支持其對任何資源的請求
做爲網關或者代理工做的服務器嘗試執行請求時,從上游服務器接收到無效的響應
表示服務器當前很忙,暫時沒法響應服務,咱們上網時有時候遇到的「網絡服務正忙,請稍後重試」的提示信息就是狀態碼 503
打個生動的比方: