Почему HTTP-метод POST не является идемпотентным?

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

Ответ

С точки зрения тестирования API, понимание идемпотентности критично для предсказуемости тестов и безопасности операций. POST не является идемпотентным, потому что каждый идентичный запрос может привести к созданию нового ресурса или изменению состояния сервера уникальным образом.

Практический пример для тестировщика: Допустим, мы тестируем endpoint для создания заказа.

POST /api/orders
Content-Type: application/json

{
  "productId": 789,
  "quantity": 1
}
  • Первый вызов: Сервер создаёт заказ с ID=1001 и возвращает статус 201 Created.
  • Второй идентичный вызов: Сервер создаёт новый заказ с ID=1002. Состояние системы изменилось (появился второй заказ), и клиент получит другой ответ (с новым ID).

Почему это важно в QA:

  1. Безопасность тестов: Повторный запуск теста с POST-запросом без очистки данных создаст дубликаты, что может сломать последующие проверки.
  2. Тестирование идемпотентности: Мы явно проверяем, что POST ведёт себя неидемпотентно, а PUT/DELETE (для одинаковых данных) — идемпотентно. Это часть валидации соответствия API RESTful-принципам.
  3. Стратегия тест-дизайна: Для операций создания мы планируем предусловия (очистку данных) и постусловия более тщательно.