Кэшируются ли PUT-запросы по HTTP?

«Кэшируются ли PUT-запросы по HTTP?» — вопрос из категории Сети, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Как правило, ответы на PUT-запросы не кэшируются. Это определяется стандартами HTTP и семантикой метода.

Причины:

  • Идемпотентность, но не кэшируемость: PUT является идемпотентным (многократное выполнение дает тот же результат), но его основная цель — обновление или создание ресурса по конкретному URI. Кэширование такого ответа привело бы к тому, что последующие GET-запросы могли бы получить устаревшие данные.
  • Семантика изменения: PUT изменяет состояние ресурса на сервере. Кэши, включая прокси-серверы и браузеры, обычно считают такие ответы некэшируемыми по умолчанию.
  • Заголовки ответа: Сервер должен явно указать, что ответ можно кэшировать, используя заголовки типа Cache-Control. Для PUT это делается крайне редко.

Пример заголовков ответа, которые запрещают кэширование (типичный случай для PUT):

HTTP/1.1 200 OK
Cache-Control: no-store
Content-Type: application/json

{"status": "updated"}

Исключение: Теоретически, если сервер для успешного PUT-запроса возвращает представление обновленного ресурса и явно задает политику кэширования (например, Cache-Control: public, max-age=3600), то ответ может быть закэширован. Однако на практике такая конфигурация встречается редко и требует осторожности, чтобы не нарушить согласованность данных.