Как исправить кеш браузера и немодифицированный ответ для JSON? jQuery.ajax({ifModified:true,cache:true}) разрыв JSON-запроса на ответ данных
Как исправить кеш браузера и notmodified
отвечать за JSON? jQuery.ajax({ifModified:true,cache:true})
JSON-запрос прерывается на data
реагировать.
При первом запросе браузера http://localhost/api возвращает статус 200 OK
и nexts 304 Not Modified
$.ajax({
type:"GET",
url:'http://localhost/api', // {"content"="Hello!"}
dataType:'json',
cache:true,
ifModified:true, // Lets respond `304:notmodified`
success:function(data,textStatus,jqXHR){
console.debug(jqXHR.status+':'+textStatus);
console.debug(data); // Why on repeated request returns `undefined`?
}
});
XHR впервые возвращается нормально:
200:success
Object {content="Hello!"}
но в следующий раз возвращается data
undefined:
304:notmodified
undefined
Как это решить? Кажется, ошибка jQuery 1.5.1. Ожидаемый результат:
304:notmodified
Object {content="Hello!"}
3 ответа
Я полагаю, что это то, как он должен работать, 304 не возвращает никаких данных, он просто говорит вам, что он не изменился.
Тем не менее, я вижу проблему, если у вас нет данных в памяти, то вам нужен какой-то метод, чтобы получить их из кэша браузера. Поэтому я думаю, что решение - написать код для кеширования данных.
Я не уверен, как HTTPS работает с etags, однако данные HTTP не всегда кешируются (разные методы и поведение в разных браузерах и версиях), поэтому, если etags работает, вам, возможно, потребуется внедрить собственный безопасный кэш.
Попробуйте добавить случайное число в конец вашего URL в качестве параметра.
random_number = Math.floor(Math.random()*10101010101)
url:'http://localhost/api?' + random_number
Когда вы получаете 304, вы должны повторно запросить данные, но с флагом "ifModified", установленным в false. Запрос будет затем подчиняться обычным правилам кэширования, и вы получите ваши кэшированные данные.
Например, в контроллере MVC...
DateTime pageLastUpdated = <.....>
if (Request.Headers["If-Modified-Since"] != null)
{
var dt = DateTime.Parse(Request.Headers["If-Modified-Since"] as string);
if (pageLastUpdated.Date == dt.Date && pageLastUpdated.Hour == dt.Hour && pageLastUpdated.Minute == dt.Minute && pageLastUpdated.Second == dt.Second) {
Response.Cache.SetCacheability(HttpCacheability.NoCache);
return new HttpStatusCodeResult(304, "notmodified");
}
}
Response.Cache.SetCacheability(HttpCacheability.Private);
Response.Cache.SetVaryByCustom("*");
Response.Cache.SetExpires(pageLastUpdated.AddDays(1));
Response.Cache.SetLastModified(pageLastUpdated);
// now return the Json
return Json(new {........});
Отправленные данные кэшируются на клиенте на срок до 1 дня.
function loadJson(url, params, onLoaded) {
// initial request
$.ajax({
type: 'GET',
dataType: 'json',
url: url,
data: params,
cache: true,
ifModified: true, // forces check with server
success: function (result, textStatus, jqXHR) {
// if 304, re-request the data
if (result === undefined && textStatus == 'notmodified') {
$.ajax({
type: 'GET',
dataType: 'json',
url: url,
data: params,
cache: true,
ifModified: false, // don't check with server
success: function (cachedResult, textStatus, jqXHR) {
onLoaded(cachedResult);
}
});
}
else
onLoaded(result);
}
});