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

Ответ

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

PUT — Полная замена

  • Семантика: "Поместить ресурс по данному URL". Клиент отправляет полное представление ресурса.
  • Идемпотентность: Да. Многократный вызов с одними данными дает тот же результат.
  • Побочный эффект: Если в запросе отсутствуют поля, существующие на сервере, они будут удалены (установлены в null или значение по умолчанию).

PATCH — Частичное обновление

  • Семантика: "Применить частичные модификации к ресурсу". Клиент отправляет только изменяемые поля.
  • Идемпотентность: Не гарантирована (зависит от реализации сервера).
  • Побочный эффект: Не указанные поля остаются без изменений.

Пример (Обновление пользователя с id=1):

// Исходный ресурс на сервере
{
  "id": 1,
  "name": "Alice",
  "email": "alice@example.com",
  "age": 30
}

// PUT-запрос (отправляем полный объект)
PUT /users/1
{
  "name": "Alice Smith",
  "email": "alice.smith@example.com"
}
// Результат: Поле `age` будет УДАЛЕНО.
// {"id":1, "name":"Alice Smith", "email":"alice.smith@example.com"}

// PATCH-запрос (отправляем только изменения)
PATCH /users/1
{
  "name": "Alice Smith"
}
// Результат: Поле `age` и `email` СОХРАНЯЮТСЯ.
// {"id":1, "name":"Alice Smith", "email":"alice@example.com", "age":30}

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

  • PUT: Когда клиент управляет всем ресурсом (например, сохранение черновика, замена конфигурации).
  • PATCH: Для оптимизации трафика и атомарного обновления отдельных полей (например, смена аватара, обновление статуса).

Ответ 18+ 🔞

Так, слушай, разберём эту дичь с PUT и PATCH, а то народ путается, как слепые котята в парадном подъезде.

Вот представь: у тебя есть пользователь, целая сущность, файл, настройка — короче, ресурс. И его надо обновить. И тут тебе на выбор два инструмента: здоровенный кувалда PUT и хирургический лазер PATCH. Выглядят похоже, а нахуяриться ими можно по-разному.

PUT — это как сказать: «На, засранец, вот тебе НОВАЯ ВЕРСИЯ, целиком! Забудь, что было!»

  • Суть: «Положи ресурс вот на этот URL». Ты должен отправить всё, блядь, целиком, всё его новое состояние.
  • Идемпотентность: Абсолютно. Сколько раз ни долби — если данные одни и те же, результат будет одинаковый. Как стучать головой в стену: десятый раз так же больно, как и первый.
  • Подводный камень, ёпта: Если ты в своей «новой версии» забыл какое-то поле — сервер честно его уберёт нахуй. Считает, раз ты не прислал — значит, тебе оно не нужно. Пиздец полный.

PATCH — это как шепнуть на ушко: «Слышь, братан, поменяй-ка вот это одно поле, остальное не трогай».

  • Суть: «Примени заплаточку, патчик». Кидаешь только то, что хочешь поменять.
  • Идемпотентность: Хуй его знает. Зависит от того, как сервер эту заплатку реализовал. Если он тупой, то десять одинаковых заплат могут нахуярить десять изменений.
  • Главный плюс: Что не тронул — то и осталось жить-поживать. Ничего не пропадёт.

Смотри, как это работает на живом примере (чтоб совсем пиздец понятно стало):

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

{
  "id": 1,
  "name": "Василий",
  "email": "vasya@derevnya.ru",
  "age": 25
}

Тебе надо имя поменять на «Василий Пупкин».

  • Если ты лоботряс и используешь PUT:

    PUT /users/1
    {
      "name": "Василий Пупкин",
      "email": "vasya@derevnya.ru"
    }

    И что получаешь? Сервер видит: «О, поле age не прислали. Значит, хуй с ним, удаляем!». Итог: {"id":1, "name":"Василий Пупкин", "email":"vasya@derevnya.ru"}. Возраст сгинул в небытие! Василий стал агаeless! Ебать ты гений!

  • Если ты не мудак и используешь PATCH:

    PATCH /users/1
    {
      "name": "Василий Пупкин"
    }

    Сервер: «Ага, понял. Меняем имя, всё остальное — по старому». Итог: {"id":1, "name":"Василий Пупкин", "email":"vasya@derevnya.ru", "age": 25}. Возраст на месте, почта на месте, все довольны.

Так когда что юзать, чтобы не выглядеть конченым идиотом?

  • PUT: Когда ты полностью контролируешь весь ресурс и меняешь его целиком. Сохранение черновика статьи, замена всей конфигурации устройства, обновление аватара (отправляя новый файл). Полная замена, блядь.
  • PATCH: Когда надо точечно тыкнуть, сэкономить трафик и не сломать то, что менять не планировал. Сменить статус заказа с «новый» на «в работе», обновить только номер телефона в профиле, добавить тег к посту.

Короче, думай головой, что ты делаешь: переписываешь книгу от корки до корки (PUT) или исправляешь опечатку на пятой странице (PATCH). Осознанный выбор спасёт тебя от ебанины, когда у половины пользователей в базе вдруг поле isActive стало null.