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

Ответ

PUT и PATCH — это HTTP-методы для обновления ресурсов, но с разной семантикой.

PUT

  • Полная замена. Клиент должен отправить полное представление ресурса, даже если меняется одно поле.
  • Идемпотентность. Многократные одинаковые запросы дают тот же результат, что и один.
  • Использование: Обновление ресурса, когда известны все его атрибуты.
PUT /api/users/123
Content-Type: application/json

{
  "name": "Иван",
  "email": "ivan@example.com", // Все поля обязательны
  "age": 30
}

PATCH

  • Частичное обновление. Клиент отправляет только изменяемые поля.
  • Не всегда идемпотентен. Результат нескольких одинаковых PATCH-запросов может отличаться (например, инкремент счётчика).
  • Использование: Экономия трафика и предотвращение конфликтов при обновлении больших объектов.
  • Форматы: Часто используется JSON Patch (RFC 6902).
PATCH /api/users/123
Content-Type: application/json

{
  "age": 31 // Только изменяемое поле
}

// Или с JSON Patch
PATCH /api/users/123
Content-Type: application/json-patch+json

[
  { "op": "replace", "path": "/age", "value": 31 }
]

Ключевое отличие: PUT заменяет ресурс целиком, PATCH применяет к нему изменения.

Ответ 18+ 🔞

Давай разберём эту дичь про PUT и PATCH, а то народ путается, как мухи в паутине, а потом удивляется, почему у него API ебётся с концами.

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

PUT — это когда ты такой: «Всё, хуй с ним, переписываю всё заново!»

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

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

{
  "name": "Иван",
  "email": "ivan@example.com", // Всё, блядь, целиком! Даже если менял только возраст.
  "age": 30
}

Представь, что ты принёс новый холодильник, а старый выкинул нахуй. Всё, целиком.

PATCH — это хитрая жопа. «Я только возраст поправлю, остальное трогать не буду».

Отправляешь только то, что меняется. Остальные поля остаются как были. Трафик экономится, да и конфликтов меньше, когда десять человек одновременно лезут в один объект. Но тут есть подвох — он не всегда идемпотентный. Если в PATCH-запросе будет «увеличить счётчик на 1», то каждый новый такой же запрос даст новый результат. А с PUT такого не бывает.

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

{
  "age": 31 // Только возраст, остальное не трогаем. Умно, да?
}

// А можно и по-умному, через JSON Patch (RFC 6902)
PATCH /api/users/123
Content-Type: application/json-patch+json

[
  { "op": "replace", "path": "/age", "value": 31 }
]

Так в чём, блядь, разница-то ключевая?

  • PUT — вырезать всё и вставить новое. Полная замена. Идемпотентно.
  • PATCH — точечно подправить, как хирург скальпелем. Частичное обновление. Может быть не идемпотентным.

Выбирай по ситуации. Если ресурс небольшой и ты всегда им полностью владеешь — можно и PUT. Если объект большой, или над ним работает несколько клиентов, или трафик жалко — твой выбор PATCH. Главное — не путай их, а то получишь ебучую кашу в данных вместо работающего API.

Видео-ответы