В чем разница между HTTP-методами POST, PUT и PATCH?

Ответ

С точки зрения тестирования API, понимание семантики этих методов критически важно для корректного написания тестов и валидации поведения системы.

POST используется для создания нового ресурса, когда идентификатор (ID) неизвестен или генерируется сервером. При тестировании мы проверяем, что в ответе приходит код 201 Created, заголовок Location с URI нового ресурса и тело с созданным объектом.

POST /api/users HTTP/1.1
Content-Type: application/json

{"name": "Anna", "email": "anna@example.com"}

PUT предназначен для полной замены ресурса по известному URI (идемпотентная операция). В тестах мы отправляем полное представление ресурса и проверяем код 200 OK (или 201 Created, если ресурс был создан). Последующие идентичные запросы не должны менять состояние системы.

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

{"id": 123, "name": "Anna Updated", "email": "anna.new@example.com"}

PATCH применяет частичные изменения к ресурсу (также идемпотентен). Тестирование PATCH сложнее: нужно проверить, что обновились только переданные поля, а остальные остались неизменными. Часто используется формат JSON Patch.

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

{"email": "anna.latest@example.com"}

Ключевые аспекты для тестировщика:

  1. Идемпотентность: PUT и PATCH при повторении с теми же данными дают тот же результат (код ответа может отличаться, но состояние ресурса — нет). POST — не идемпотентен, каждый вызов создает новый ресурс.
  2. Коды ответов: Ожидаем 201 для успешного POST, 200/204 для PUT/PATCH. Важно проверять и негативные сценарии (например, 409 Conflict при попытке создать дубликат через PUT).
  3. Валидация: Для PUT необходимо валидировать, что клиент отправил все обязательные поля для полного обновления. Для PATCH — что частичное обновление допустимо для бизнес-логики.

Ответ 18+ 🔞

Давай разберем, как это всё работает на практике, а то в этих ваших REST-ах можно, блядь, запутаться, как в трёх соснах. Семантика — это, конечно, важно, но без понимания, что на самом деле происходит, ты будешь тестировать, как мартышка с гранатой.

Смотри, POST — это когда ты, грубо говоря, рожаешь новую сущность. Ты не знаешь, какой у неё будет ID, это сервер решает. Твоя задача как тестировщика — послать запрос и проверить, что в ответе тебе не просто сказали «ок», а выдали полный паспорт на новорождённого: код 201 Created, заголовок Location (типа адрес прописки) и само тело с данными. Если этого нет — это пиздец, а не API.

POST /api/users HTTP/1.1
Content-Type: application/json

{"name": "Anna", "email": "anna@example.com"}

А теперь PUT — это уже не роды, а полный капремонт. У тебя есть точный адрес (URI), и ты приезжаешь туда со всей новой мебелью, выкидываешь старую хуйню и ставишь свою. Идемпотентность — это ключ, чувак. Сделал раз, сделал десять раз — результат должен быть одинаковый, ресурс на том же месте и в том же виде. Проверяешь код 200 OK (или 201, если вдруг такого адреса не было и тебя там поселили). Главное — в запросе должен быть ВЕСЬ объект, а не куски.

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

{"id": 123, "name": "Anna Updated", "email": "anna.new@example.com"}

Ну а PATCH — это, блядь, точечный тюнинг. Приехал, поменял только одну розетку, обои не трогал. Тоже идемпотентно: сколько раз ни меняй эту розетку, в итоге будет одна новая. Вот тут тестирование — это просто ёперный театр! Надо проверить, что обновилось ТОЛЬКО то, что ты послал, а всё остальное осталось, как было. Часто для этого используют JSON Patch, но и просто объект с парой полей тоже прокатывает.

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

{"email": "anna.latest@example.com"}

На что смотреть, чтобы не облажаться:

  1. Идемпотентность — твой друг. С PUT и PATCH можешь долбить запросы сколько влезет — состояние системы не должно ехать крышей. А вот POST — это как кролики: каждый новый запрос плодит новую сущность. Запутаешь — будет тебе овердохуища дубликатов.
  2. Коды ответов — это не просто цифры. 201 Created для POST — святое. 200 OK или 204 No Content для PUT/PATCH — норма. А если тебе в ответ на PUT прилетает 409 Conflict — это значит, что бизнес-логика взбунтовалась, типа «чувак, так делать низя». Это тоже надо тестить!
  3. Валидация — вот где собака порылась. Для PUT — проверяй, что если ты не прислал какое-то обязательное поле, тебя посылают нахуй с ошибкой. Для PATCH — что нельзя отправить ерунду, которая ломает логику (например, через PATCH сделать юзеру email пустым, если это запрещено). Доверия ебать ноль — проверяй всё.

Короче, смысл в том, чтобы не просто тупо отправлять запросы и смотреть, не упало ли, а понимать, какое состояние системы должно быть ДО и ПОСЛЕ. Иначе твои тесты — это просто мартышлюшка с кнопкой.