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

Ответ

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

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

Практический пример (Обновление пользователя):

Исходный ресурс GET /users/123:

{
  "id": 123,
  "name": "John",
  "email": "john@old.com",
  "age": 25
}

Запрос PUT:

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

{
  "name": "John Doe",
  "age": 26
}

Результат (GET /users/123): Поле email удалено, так как не было передано.

{
  "id": 123,
  "name": "John Doe",
  "age": 26
}

Запрос PATCH:

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

{
  "age": 26
}

Результат (GET /users/123): Изменилось только поле age, email остался нетронутым.

{
  "id": 123,
  "name": "John",
  "email": "john@old.com",
  "age": 26
}

Важные свойства:

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

Ответ 18+ 🔞

А, слушай, смотри, вот эти ваши PUT и PATCH — они вроде оба для обновления, но разница там, блядь, как между «переехать в новую квартиру» и «починить унитаз». Охуеть, да?

  • PUT — это, сука, полная замена, тотальная. Ты приносишь на сервер весь новый ресурс, целиком. Что не принёс — того нахуй и не будет, сгорит в аду. Сервер смотрит: «А, понятно, старую версию — на свалку, кладём вот эту». Если забыл про поле email — пиши пропало, пользователь теперь без мыла, как бомж.
  • PATCH — это точечный ремонт, хирургический. «Доктор, у меня тут только возраст болит, на 26 поменяйте, а всё остальное не трогайте, оно норм». Идеально.

Смотри, как это на практике, на примере какого-нибудь юзера:

Допустим, был у нас чувак. Запросили его: GET /users/123

{
  "id": 123,
  "name": "John",
  "email": "john@old.com",
  "age": 25
}

Ситуация первая: прилетает PUT, как танк.

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

{
  "name": "John Doe",
  "age": 26
}

И что получается? А получается, что сервер, такой: «О, новый Джон! Вижу только имя и возраст. Значит, это и есть весь Джон. Старого — в мусорку!». И отныне наш юзер выглядит так:

{
  "id": 123,
  "name": "John Doe",
  "age": 26
}

Почта john@old.com? Да хуй там! Её в запросе не было — значит, её в природе не существует. Джон теперь без email, ебать его в сраку. Полная замена, мать её.

Ситуация вторая: прилетает PATCH, как снайпер.

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

{
  "age": 26
}

И сервер, такой довольный: «Ага! Значит, нужно только возраст поменять на 26. Остальное — не трогаем, работает же». Итог:

{
  "id": 123,
  "name": "John",
  "email": "john@old.com",
  "age": 26
}

Всё на месте, только возраст подправили. Красота!

А теперь, блядь, важные нюансы, чтобы не обосраться:

  • Идемпотентность (это когда сколько раз ни делай — результат один): PUT — идемпотентный, да. Десять раз шлёшь одно и то же — ресурс после первого раза уже такой и останется. А вот PATCH — тут как повезёт. Если он просто значения меняет, то может быть идемпотентным. А если он, например, «увеличить счётчик на 1» — то каждый вызов будет плюсовать, тут уже пиши пропало, идемпотентности ноль ебать.
  • Когда что юзать: PUT — когда ты бог и знаешь всё состояние ресурса. Или для полной перезаписи/создания. PATCH — это овердохуища удобно, когда ресурс большой, а поменять надо три поля. Трафик меньше, конфликтов при параллельном редактировании тоже меньше. В общем, умный выбор.