場景
啓動Node服務器之後,GET一個文件資源,多次刷新發現除了第一次,之後的相應碼皆爲304
。
響應分爲五類:信息響應(100–199),成功響應(200–299),重定向(300–399),客戶端錯誤(400–499)和服務器錯誤 (500–599)
首先看響應碼大類:
請求碼格式 | 含義 |
---|---|
1XX | 信息響應 |
2XX | 成功響應 |
3XX | 重定向 |
4XX | 客戶端錯誤 |
5XX | 服務端錯誤 |
再看200和304的區別:
-
200 OK
請求成功。成功的含義取決於HTTP方法:
GET:資源已被提取並在消息正文中傳輸。 HEAD:實體標頭位於消息正文中。 POST:描述動作結果的資源在消息體中傳輸。 TRACE:消息正文包含服務器收到的請求消息
-
304 Not Modified
如果客戶端發送了一個帶條件的 GET 請求且該請求已被允許,而文檔的內容(自上次訪問以來或者根據請求的條件)並沒有改變,則服務器應當返回這個狀態碼。304 響應禁止包含消息體,因此始終以消息頭後的第一個空行結尾。
也就是說,兩者都表示獲取到了資源。
區別:
第一次請求服務器,得到資源的響應,響應碼爲200
(此時客戶端的瀏覽器可能會對響應數據進行緩存,根據瀏覽器設置而定)
之後再次請求,此時:
瀏覽器這邊有一份數據,時間戳爲aaa,
請求到服務端的時候,發現服務器裏的數據,自從上次請求之後未經修改,那就不用了發數據回來了。
所以此時返回狀態碼304
程序裏是如何判斷:這次要從服務器請求的資源,我在瀏覽器已經訪問過,有了緩存,且兩份資源一樣的|未經修改的?
兩個參數:
- 請求頭的If-Modified-Since
- 響應頭的Last-Modified
就是通過比較這兩個參數是否變化。
驗證:
兩種方式驗證:
- 修改服務端的文件內容(加空行,字符之類的,重新保存)
- 請求|禁用本次資源:切換瀏覽器,或清除瀏覽器緩存、禁用瀏覽器緩存等。
再次發起請求,查看狀態碼,爲200
。