$ .jsonp没有缓存

Wes*_*ley 0 javascript browser jquery caching jsonp

我正在使用第三方jsonp库进行jquery.在调用它时,您可以将缓存设置为true.

但是,在检入HTTP嗅探器时,似乎所有请求仍然被发送到服务器.

这与picasa,flickr和youtube API.

什么可能导致这种行为?它似乎不是浏览器特定的,因为我在多个浏览器中测试它并且所有行为都相同(不是缓存).

调用的URL不会从一个请求更改为另一个请求,并且调用如下所示:

        $.jsonp({
            url: url,
            cache: true,
            async: false,
            dataType: 'jsonp',
            data: $.extend({ url: options.dataUrl, method: lookupData.method }, fixedOptions),
            callbackParameter: "jsoncallback",
            success: function(data)
            {
                $.extend(datasourceOptions, lookupData.onData(data));
                getData();
            }
        });
Run Code Online (Sandbox Code Playgroud)

关于我的设置唯一的"奇怪"的事情是,将调用.jsonp脚本通过一个包括阿贾克斯调用本身..莫非是这里的问题?听起来很遥远,但......

谢谢,韦斯利

编辑:好的,4个中有3个有Expires头设置..

但是,第四个没有,只有这些:

Cache-Control:private Vary:Accept-Encoding Access-Control-Allow-Origin:*Connection:close

(这是flickr)

那里发生了什么?

另外,是不是可以通过jquery以某种方式覆盖头缓存指令?

Arl*_*eon 5

缓存标头

首先,服务器响应您的jsonp调用必须在响应头中有一些到期日期.正如你所提到的,你无法控制youtube,flickr等如何回答jsonp调用.

浏览器缓存

浏览器正在使用每个唯一URL的可接受标头缓存调用.

jQuery JSONP回调和标识符

jQuery发送两个使您的URL唯一的数据.如果您不更改这两个选项,您的jsonp调用将永远不会缓存. 在这里阅读更多

  • 您的json数据填充的实际callback = param值.看起来像这样:.callback=jQuery_123971236127631276
  • 唯一标识符,使每个URL都唯一,因此不可缓存.看起来像这样:_=123918712387612398.

禁用唯一的JSONP回调

调用的get参数callback被赋予jQuery生成的随机名称,这样可以立即触发许多jsonp调用,并且响应不会相互干扰.但是,如果您希望缓存某个jsonp调用,则必须更改此项.该属性jsonpCallback用于覆盖此功能.

$.jsonp({
            url: url,
            dataType: 'jsonp',
            data: $.extend({ url: options.dataUrl, method: lookupData.method }, fixedOptions),


            // Note: using success : function(){ ... } will not be 
            // called if 'jsonpCallback' attribute is set. 
            jsonpCallback : 'myCallback',
 });
Run Code Online (Sandbox Code Playgroud)

禁用唯一网址标识符

此URL标识符在参数列表中设置,以便每个调用都是唯一的,如下所示:...&_=1231981238712.删除此功能可以通过向cache : true选项添加属性来完成.

$.jsonp({
            url: url,
            dataType: 'jsonp',
            data: $.extend({ url: options.dataUrl, method: lookupData.method }, fixedOptions),

            // Note: using success : function(){ ... } will not be 
            // called if 'jsonpCallback' attribute is set. 
            jsonpCallback : 'myCallback',

            // Disables: ... &_=1231829812386
            cache : true
 });
Run Code Online (Sandbox Code Playgroud)