Должен ли я добавить Cache-Control: no-cache для конечных точек GET моего REST API?

При создании REST API работа с POST/PUT проста. Они неидемпотентны и поэтому НЕ кэшируются браузерами по умолчанию.

Однако при создании конечной точки GET все становится сложнее. У меня есть опасения, что браузеры (или конкретный) по умолчанию будут пытаться кэшировать GET-запросы всякий раз, когда они могут, и в итоге я получу устаревшие данные.

Реальна ли эта боязнь агрессивного кэширования?

Возьмем в качестве примера конечную точку GET /articles/123/comments.

Несмотря на то, что эта конечная точка является конечной точкой GET, каждый запрос может возвращать разное содержимое по мере отправки комментариев к статье.

  • Будет ли это кэшироваться?
  • Будет ли он кэшироваться конкретным агрессивным браузером?

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

content-length: 2518
content-type: application/json
date: Thu, 17 Oct 2019 07:51:59 GMT
status: 200

Как лучше всего избегать устаревших данных для запросов GET?

Кажется, существуют разные стратегии решения этой проблемы, но какой из них будет лучшим?

  • кешировать мои вызовы GET с помощью уникальной строки запроса?

    eg. GET /articles/123/comments?nonce=12312310980923409

  • добавление Cache-Control: no-cache (всегда ли это будет соблюдаться?)

  • добавить ETag: xyz_HASH_OF_MY_LIST_OF_COMMENTS?

  • добавление Cache-Control: max-age=0 (для отключения кэширования)

  • добавление Cache-Control: max-age=60 (для уменьшения максимальной продолжительности кэширования)

  • просто не беспокойтесь и предположите, что без заголовков, таких как ETag, Last-Modified, запрос GET не будет кэшироваться ни одним из браузеров?


person Dimitry K    schedule 17.10.2019    source источник


Ответы (1)


Для браузера запросы GET выглядят одинаково, независимо от того, были ли они созданы с помощью JavaScript для вашего REST API или путем ввода URL-адреса в адресной строке.

Что произойдет, если вы не установите заголовки кэширования?

Спецификация позволяет браузеру делать все, что он хочет.

По умолчанию браузеры кешируют ответы на GET-запросы и используют метод наилучшего предположения для продолжительности.

Вы всегда должны явно устанавливать кэширование, чтобы получить согласованное поведение.

Подробнее см.

Как избежать устаревшего контента?

На это нет простого ответа. Это зависит от того, как часто меняется ваш ресурс. Если он никогда не меняется, вы можете кэшировать его на долгое время, например, пост в блоге. Если он иногда меняется, вы можете кэшировать его на более короткое время, например новостной API. Если он постоянно меняется, его не следует кэшировать, например, ленту новостей в социальных сетях, API курсов акций и т. д.

person philmcole    schedule 01.02.2021