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

Ответ

PUT полностью заменяет ресурс новыми данными. Если какие-то поля не указаны в запросе, они будут удалены. PUT является идемпотентным — повторные одинаковые вызовы дают один и тот же результат.

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

Пример PUT (полная замена):

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

{
  "email": "new@example.com"
  // Поле "name" будет удалено, если не указано
}

Пример PATCH (частичное обновление):

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

{
  "email": "new@example.com"
  // Поле "name" останется неизменным
}

Практическое правило: Используйте PUT, когда клиент может и должен отправить полное представление ресурса. Используйте PATCH для точечных обновлений, особенно для больших объектов.

Ответ 18+ 🔞

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

Смотри, есть у тебя пользователь в базе — цельная сущность, как тот самый здоровенный немой дворник. Допустим, он выглядит так:

{
  "id": 123,
  "name": "Герасим",
  "email": "gerasim@dvor.ru",
  "role": "дворник"
}

PUT — это когда ты приходишь и говоришь: "Всё, старый мир говно, делаем по-новому, нахуй!" Ты присылаешь ПОЛНОСТЬЮ НОВОГО пользователя. Что не указал — того и не будет, сгорит в аду. Идемпотентный он, потому что сколько раз ни пришли и ни сказали "делаем вот так" — результат один и тот же, ебать.

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

{
  "email": "newboss@example.com"
}

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

{
  "id": 123,
  "email": "newboss@example.com"
  // Полей name и role больше нет. Их съели.
}

PATCH — это хитрая жопа. Ты подкрадываешься и шепчешь: "Слушай, брат, давай-ка только почту поменяем, а всё остальное пусть будет как есть, а?"

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

{
  "email": "newboss@example.com"
}

И тут сервер, такой: "О, окей, понял тебя, чувак". И меняет ТОЛЬКО почту, не трогая остальное:

{
  "id": 123,
  "name": "Герасим", // На месте!
  "email": "newboss@example.com", // Обновилось!
  "role": "дворник" // Тоже на месте!
}

Так когда что использовать, ёпта?

  • PUT — когда ты с фронта держишь ВСЕ данные объекта и точно знаешь, как он должен выглядеть ПОЛНОСТЬЮ. Например, страница редактирования профиля, где все поля. Отправил — и бабах, всё заменилось.
  • PATCH — для точечных, хитрожопых обновлений. Сменил аватарку, подписался на рассылку, поставил лайк. Незачем гонять весь объект весом в овердохуища гигабайт, чтобы поменять одно поле liked: true. Отправил патч — и свободен.

И да, запомни: PUT — идемпотентный, PATCH — обычно нет. Потому что если ты десять раз шлёшь один и тот же PUT — нихуя не изменится. А если десять раз шлёшь PATCH "увеличить счётчик на 1" — он каждый раз увеличится, и будет тебе десять, а не один. Вот такая, блядь, математика.

Короче, не будь как тот князь, который сразу "мочить, блядь". Подумай, что тебе нужно: переписать всю историю с нуля (PUT) или просто подправить концовку (PATCH).