Что такое идемпотентность HTTP-запроса?

«Что такое идемпотентность HTTP-запроса?» — вопрос из категории HTTP и веб-протоколы, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Идемпотентность — свойство HTTP-метода, означающее, что многократное выполнение одного и того же запроса с одинаковыми данными приводит к одному и тому же результату и не вызывает дополнительных побочных эффектов после первого успешного выполнения.

Идемпотентные методы (согласно RFC 7231):

  • GET: Получение ресурса. Повторные запросы не изменяют состояние сервера.
  • PUT: Создание или полное замещение ресурса по известному URI. Повторные запросы с тем же телом не создают новые ресурсы.
  • DELETE: Удаление ресурса. После первого успешного удаления ресурса последующие запросы должны возвращать 404 Not Found или 410 Gone, что является одинаковым результатом.
  • HEAD: Аналогичен GET, но без тела ответа.
  • OPTIONS и TRACE: Также идемпотентны.

Неидемпотентный метод:

  • POST: Каждый запрос обычно создаёт новый ресурс, меняя состояние сервера.

Пример идемпотентности PUT:

PUT /api/users/123 HTTP/1.1
Content-Type: application/json

{"name": "Alice", "role": "admin"}

Почему это важно для тестирования и разработки API?

  1. Безопасность повторных запросов: Клиент может безопасно повторять запрос при таймаутах или сетевых сбоях, не опасаясь дублирования операций (например, списания денег дважды).
  2. Тестирование: Идемпотентные эндпоинты проще тестировать, так как их можно вызывать многократно, не очищая состояние.
  3. Проектирование: При создании API следует стремиться к идемпотентности для методов обновления (PUT, PATCH для определённых операций) и удаления.