Принудительное использование кэша HTTP с выборкой

#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. Все так, как вы говорите. Я чувствую себя глупо. Кэш был отключен в инструментах разработчика.