При создании 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 с помощью уникальной строки запроса?
напр. 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 не будет кэшироваться ни одним из браузеров?