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

Ответ

Оба метода используются для обновления ресурсов, но с разной семантикой, что критично для проектирования идемпотентных и предсказуемых RESTful API.

  • PUTполная замена ресурса. Клиент отправляет полное представление ресурса. Сервер должен полностью заменить целевой ресурс присланными данными. Любые поля, не указанные в запросе, должны быть трактованы как null или значения по умолчанию. PUT является идемпотентным (многократный одинаковый запрос дает тот же результат).

  • PATCHчастичное обновление ресурса. Клиент отправляет только те поля, которые необходимо изменить, и инструкции по их изменению (например, в формате JSON Patch). Сервер применяет эти изменения к существующему ресурсу. Остальные поля остаются нетронутыми. PATCH не обязательно идемпотентен (зависит от типа операции в теле запроса).

Примеры: Допустим, у нас есть ресурс пользователя:

// GET /users/123
{
  "id": 123,
  "name": "Alice",
  "email": "alice@example.com",
  "age": 30
}

Запрос PUT для обновления имени:

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

{
  "name": "Alice Smith"
}

Результат после PUT: Поля email и age будут удалены, так как не были переданы! Ресурс станет {"id": 123, "name": "Alice Smith"}.

Запрос PATCH для обновления имени (используя JSON Merge Patch):

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

{
  "name": "Alice Smith"
}

Результат после PATCH: Только поле name изменится. Ресурс станет {"id": 123, "name": "Alice Smith", "email": "alice@example.com", "age": 30}.

Когда использовать:

  • Используйте PUT, когда клиент имеет полный контроль над ресурсом и может/должен отправлять его полное состояние (например, редактирование профиля через форму).
  • Используйте PATCH, когда нужно обновить одно-два поля, чтобы уменьшить трафик и избежать риска случайного перезатирания других данных (например, смена аватара или настройки уведомлений).

Ответ 18+ 🔞

Да ты посмотри, какая тонкая хуйня, а! Просто пиздец, как важно не перепутать, а то потом сидишь и чешешь репу: "Почему у меня у юзера почта схуяли пропала, блядь?"

Ну, слушай сюда, распишу как для дебила, но ты не обижайся, просто тема такая, ёпта.

Вот представь, у тебя есть пользователь, целая сущность, как карточка в базе. И ты её, блядь, обновить захотел.

PUT — это как взять и выебать мозг. Полностью, нахуй. Ты приходишь с НОВОЙ карточкой и говоришь: "Всё, старая — в мусорку, хуй с ней. Вот эта новая — теперь истина в последней инстанции, блядь". Если в новой карточке ты указал только имя, то всё остальное — почта, возраст, любимый цвет — обнуляется, стирается, идёт нахуй. Потому что ты прислал ПОЛНОЕ состояние. И сколько раз ни присылай одно и то же — результат будет одинаковый, это и есть идемпотентность, ебать её в сраку.

PATCH — это как хирургическая операция, блядь. Ты не трогаешь всю карточку. Ты говоришь: "Слушай, братан-сервер, вот тут у меня в поле 'имя' опечатка, исправь её на 'Алиса Смит', а всё остальное не трогай, оно и так норм". И сервер такой: "Окей, понял тебя, чувак", и аккуратно меняет только то, что попросили. И трафика меньше, и риска нихуя не сломать то, что не надо.

Вот смотри на примере, а то я уже заебался объяснять:

Был у нас юзер:

{
  "id": 123,
  "name": "Alice",
  "email": "alice@example.com",
  "age": 30
}

Если ты такой умный и сделал PUT:

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

{
  "name": "Alice Smith"
}

И что мы имеем, блядь? А имеем мы пиздец! Ты же прислал только имя! Сервер честно, как идиот, заменил ВСЮ запись на то, что ты дал. И теперь у Алисы нет ни почты, ни возраста. Просто {"id": 123, "name": "Alice Smith"}. Поздравляю, ты её обезличил, мудак!

А если бы ты сделал PATCH, хитрая жопа:

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

{
  "name": "Alice Smith"
}

Вот тут сервер умный, он смотрит: "Ага, чувак хочет поменять только имя. Ну окей". И меняет ТОЛЬКО имя. И всё остальное — почта, возраст — остаётся на месте, живёт себе спокойно. Идеально, блядь!

Короче, вывод, чтобы в голове отложилось:

  • PUT — когда ты БОГ и знаешь ВСЁ состояние ресурса. Полная замена, пиздец и точка. Используй для полных форм редактирования.
  • PATCH — когда ты ленивая жопа и не хочешь тащить все поля, или когда нужно точечно тыкнуть одно значение. Частичное обновление, чтобы не выстрелить себе в ногу.

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