2012-08-01 33 views
10

我對Chrome有這個奇怪的問題。它經常會緩存PUT請求。Chrome瀏覽器正在緩存HTTP PUT請求

詳細信息:我有一個應用程序使用backbone.js,當試圖堅持對模型進行一些更改(骨幹自動生成PUT請求)時,Chrome不會將該請求發送到服務器。它在Firefox和IE中工作得很好(迄今爲止在Safari上還沒有看到這個問題)。

下面是Chrome開發人員工具「網絡」選項卡的屏幕截圖。如您所見,PUT請求的響應正從緩存中返回(請求不會觸及服務器!!) Chrome caches PUT request

下面是該同一請求的標頭詳細信息的屏幕截圖。再次表明,Chrome不會將PUT請求發送到服務器。 Chrome cached PUT request header

請求的負載是JSON數據。任何想法爲什麼這是發生/我做錯了什麼?

更新:鉻已確認這確實是bug on it's end(感謝JanHančič)。

治標不治本 我結束了覆蓋Backbone.sync方法和附加一個時間戳PUT,POST的查詢字符串和DELETE請求,讓他們始終是唯一的:

if(!options.data && model && (method == 'create' || method == 'update' || method == 'delete')) { 
    params.url += (params.url.indexOf('?') == -1 ? '?' : '&') + '_=' + new Date().getTime(); 
} 
+2

請問如果在PUT請求發送數據時,如果更改提交併觸發數據,你會之前就已經發送或這是否也occure這只是發生再次請求? – 2012-08-01 06:45:24

+0

服務器的響應不會改變,也許這就是它緩存的原因。就像羅賓說的那樣,更改/更正請求 – Zebra 2012-08-01 06:46:19

+1

數據肯定會改變。但是,我認爲數據是否已經改變並不重要。 PUT實際上不是可緩存的請求類型。它意味着將數據發送到服務器,而不是獲取數據。 – anushr 2012-08-01 06:48:40

回答

4

我使用額外的參數,以避免緩存:

url += '?_dc=' + Math.random().toFixed(20).replace('.', ''); 

我不解釋服務器端的這個參數。

編輯:除了鉻有很多東西可以緩存請求 - 例如用戶的代理服務器。我認爲額外的查詢參數是避免緩存的一個很好的解決方案。

+0

我同意這將是適當的解決方法。我試過這樣做,但不幸的是,因爲我們使用backbone.js,添加額外的查詢字符串參數是相當困難的(除非有人對如何獲得請求有效載荷和查詢字符串參數與骨​​幹) – anushr 2012-08-01 07:29:57

+0

您可以爲模型實現'sync'方法。正如我所看到的,你可以通過'options'將'url'傳遞給'Backbone.sync'方法。有關更多詳細信息,請參閱http://backbonejs.org/#Sync和backbone的「sync」實現。你可以包裝'Backbone.sync'並在一個地方完成所有這些工作。 – 2012-08-01 07:39:34

+0

無論何時出現PUT,POST或DELETE請求,我最終都會覆蓋'Backbone.sync'幷包括時間戳記('url + ='?_ ='+ new Date()。getTime()')與所有3) – anushr 2012-08-01 21:47:24

0

主幹使用jQuery或Zepto來發出AJAX請求。假設您正在使用jQuery,請關閉緩存。

運行這關設置緩存在整個應用程序,所以你不必擔心緩存:

$.ajaxSetup({ 
     cache : false 
}); 

如果保持高速緩存上是爲您的企業很重要,我認爲你可以做一些事情喜歡本作的具體沒有緩存調用:

model.save({}, {cache:false}); 
+1

'cache'屬性只對'GET'請求有效(它應該是)。它對'PUT'請求沒有任何作用。 – anushr 2012-08-01 21:32:31

+0

我不這麼認爲,我將緩存設置爲false,並且看到PUT請求具有noCache查詢。 – 2012-08-01 23:29:01

+0

不確定你在哪裏得到有關該緩存的錯誤信息只適用於GET請求,也許今天你將在Backbone.Syncs上覆蓋,稍後當你只測試$ .ajaxSetup時,你會明白它的工作原理。我有很多使用Backbone.js和jQuery的項目,我知道這一行就夠了。 – 2012-08-01 23:35:10