#javascript #http #fetch #http-caching
Вопрос:
Я пытаюсь использовать кэш HTTP для чего-то простого, но я не могу заставить его работать.
Я использую следующие варианты для fetch()
.
fetch('test', { cache: 'force-cache', headers: { 'Cache-Control': 'max-age=3600', 'Pragma': 'max-age=3600', // added for redundancy } }) .then( response =gt; response.json() ) .then( data =gt; console.log(data) ) .catch( error =gt; console.error(error) ) .finally( () =gt; console.log('Done') );
test
Конечная точка просто возвращает json в следующем формате
{ "date": "...", /* date in 'Y-m-d H:i:s' format */ }
Я убедился, что в ответе также есть заголовок управления кэшем. Я вижу это, когда просматриваю заголовки ответов.
HTTP/1.1 200 ОК Сервер: Apache Контроль кэша: общедоступный, максимальный возраст=3600 Содержание-Длина: 30 Сохраняйте жизнь: время ожидания=5, максимум=94 Связь: Сохраняй-Живи Тип содержимого: приложение/json; кодировка=UTF-8
Заголовки запросов также кажутся правильными.
Связь: сохраняй-живи Прагма: максимальный возраст=3600 Контроль кэша: максимальный возраст=3600 Принимать: */* Sec-Fetch-Сайт: того же происхождения Режим секундной выборки: cors Сек-Фет-Дест: пусто
Я пытался просто запускать одну и ту же выборку снова и снова в течение минуты, ожидая получить одну и ту же дату, без изменений, но результаты всегда были, так сказать, «новыми».
Есть ли у меня фундаментальное непонимание того, как работает кэш HTTP, или мне лучше просто кэшировать значение в фоновом режиме?
В настоящее время я тестирую, запустив следующий код внутри lt;scriptgt;
тега.
let x = 0; const interval_id = setInterval(() =gt; { fetch('test', { ... }); if ( x === 20) { window.clearInterval(interval_id); } }, 1500);
Я ожидаю, что мне вернут одну и ту же дату и время 20 раз (кэшируйте первый ответ)
Комментарии:
1. Как ты справляешься снова и снова? Если это происходит с помощью перезагрузки, обратите внимание, что поведение перезагрузки браузера не стандартизировано и часто игнорирует кэш. Вместо этого попробуйте открыть тот же URL-адрес на новой вкладке.
2. Сервер определяет заголовки кэша и указывает клиенту, как кэшировать ответ. Вы не можете сделать это на клиенте, хотя вы могли бы создать свой собственный кэш выборки.
3. @KevinChristopherHenry Я не перезагружаю, просто снова и снова запускаю один и тот же запрос на выборку в консоли
4. @IGP Если вы пробовали это на сервере, поделитесь всеми подробностями. Также обратите внимание, что если у вас открыты инструменты разработчика, кэширование может быть отключено.
5. Все так, как вы говорите. Я чувствую себя глупо. Кэш был отключен в инструментах разработчика.