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

Ответ

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

PUT

  • Полная замена: PUT используется для полной замены существующего ресурса. Тело запроса должно содержать полную новую версию ресурса.
  • Идемпотентность: PUT является идемпотентным. Это значит, что многократное выполнение одного и того же PUT запроса приведет к тому же состоянию ресурса, что и один запрос.
  • Создание ресурса: Если ресурс по указанному URI не существует, PUT может его создать.

PATCH

  • Частичное обновление: PATCH используется для частичного изменения ресурса. Тело запроса содержит только те поля, которые нужно изменить.
  • Идемпотентность: PATCH не всегда идемпотентен. Например, запрос на инкремент значения ({ "op": "increment", "field": "counter" }) при повторном выполнении даст другой результат. Однако, простой запрос на изменение значения поля ({ "name": "новое имя" }) будет идемпотентным.
  • Эффективность: Более эффективен для сети, когда нужно обновить лишь малую часть большого ресурса.

Наглядный пример:

Допустим, на сервере есть ресурс /users/1:

{
  "id": 1,
  "name": "Иван",
  "email": "ivan@example.com"
}

1. Запрос с PUT для смены имени:

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

{
  "name": "Петр"
}

Результат: Поле email будет удалено или установлено в null, так как оно не было передано в запросе на полную замену.

{
  "id": 1,
  "name": "Петр",
  "email": null
}

2. Запрос с PATCH для смены имени:

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

{
  "name": "Петр"
}

Результат: Изменится только поле name, остальные поля останутся нетронутыми.

{
  "id": 1,
  "name": "Петр",
  "email": "ivan@example.com"
}
ХарактеристикаPUTPATCH
ДействиеПолная замена ресурсаЧастичное обновление
Тело запросаСодержит ресурс целикомСодержит только изменения
ИдемпотентностьВсегда идемпотентенМожет быть неидемпотентным
Основное применениеОбновление всего объектаИзменение отдельных полей