Может ли идемпотентный HTTP-запрос изменить состояние сервера

«Может ли идемпотентный HTTP-запрос изменить состояние сервера» — вопрос из категории HTTP и веб-протоколы, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, может. Идемпотентность означает, что повторение одного и того же запроса N раз имеет тот же эффект, что и выполнение его один раз. Это не запрещает изменение состояния сервера при первом вызове.

Ключевая идея: После первого успешного запроса состояние сервера изменится. Все последующие идентичные запросы не должны вносить дополнительных изменений.

Примеры идемпотентных методов, которые меняют состояние:

  • PUT /users/123 – Создает или полностью заменяет ресурс с ID 123.

    PUT /users/123 HTTP/1.1
    Content-Type: application/json
    {"name": "Anna"}

    Первый вызов создаст/обновит пользователя. Повторные вызовы с теми же данными оставят ресурс в идентичном состоянии.

  • DELETE /articles/456 – Удаляет статью с ID 456. Первый вызов удалит статью (состояние сервера изменилось). Последующие вызовы вернут тот же результат (например, 404 Not Found или 204 No Content), не вызывая новых изменений.

Противопоставление:

  • POST – Обычно не идемпотентен. Каждый вызов POST /orders создаст новый заказ, меняя состояние сервера каждый раз.
  • GET – Идемпотентен и, по соглашению, не должен менять состояние сервера (должен быть безопасным).

Идемпотентность критически важна для надежности: она позволяет безопасно повторять запросы при сбоях сети, не опасаясь дублирования операций.