$ .jsonp не кешируется - PullRequest
       20

$ .jsonp не кешируется

0 голосов
/ 26 июля 2011

Я использую стороннюю библиотеку jsonp для jquery.При обращении к нему вы можете установить кэш в true.

Однако после проверки сниффера HTTP все запросы все еще отправляются на сервер.

Это с помощью API picasa, flickr и youtube.

Что может быть причиной такого поведения?Похоже, что он не зависит от браузера, так как я тестировал его в нескольких браузерах, и все они ведут себя одинаково (не кеширование).

Вызываемые 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();
            }
        });

Единственная «странная» вещь в моей настройке заключается в том, что скрипт, который будетвызов .jsonp включен через сам вызов .ajax. Может ли это быть проблемой здесь?Звучит странно, но ...

Спасибо, Уэсли

Редактировать: Хорошо, 3 из 4 имеют установленные заголовки Expires ..

Однакоу четвертого нет и есть только:

Cache-Control: private Варьируется: Accept-Encoding Access-Control-Allow-Origin: * Connection: close

(это flickr)

Что там происходит?

Кроме того, нельзя ли каким-либо образом переопределить директивы кэширования заголовков через jquery?

Ответы [ 2 ]

5 голосов
/ 02 мая 2013

Заголовки кэша

Прежде всего, сервер, отвечающий на ваши вызовы jsonp, должен иметь некоторую дату окончания срока действия в заголовках ответа.Как вы упомянули, вы не контролируете, как youtube, flickr и т. Д. Отвечают на вызовы jsonp.

Кэш браузера

Браузер кэширует вызовы с помощью допустимые заголовки для каждого уникального URL .

jQuery JSONP Обратный вызов и идентификатор

jQuery отправляет две части данных, которые делают ваши URL уникальными. Если вы не измените эти две опции, ваши вызовы jsonp никогда не будут кэшироваться. Подробнее здесь

  • Фактический обратный вызов = значение параметра, по которому ваши данные json дополняются с.Выглядит примерно так: 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',
 });

Отключение уникального идентификатора URL

Этот идентификатор 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
 });
1 голос
/ 26 июля 2011

Я ожидаю, что сервисы, которые вы вызываете, возвращают заголовки управления кэшем, которые сообщают браузеру, чтобы они не кэшировали ответ / очень быстро истекали из кэшированного ответа. Вы должны быть в состоянии видеть их в сообщениях HTTP. Ищите Cache-Control и / или Expires, такого рода вещи.

Повторное редактирование:

Кроме того, нельзя ли как-то переопределить директивы кэширования заголовков через jquery?

Я так не думаю, нет, конечно, не с JSON-P, который в своей основе является элементом script, добавляемым на страницу, поэтому программный контроль над этим будет чрезвычайно ограничен. Честно говоря, даже если бы это был XHR, я не думаю, что есть способ заставить браузер использовать кэшированную версию, которая устарела в соответствии с ее источником.

Если это происходит в течение жизненного цикла страницы, вы можете кэшировать результат самостоятельно в объекте на странице, но я предполагаю, что вы говорите о кэшировании между посещениями страницы (хотя я не могу сразу понять, почему Вы хотите победить определение происхождения свежих / несвежих).

...