2012-08-01 170 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