Ответ
Оба метода используются для обновления ресурса на сервере, но они делают это по-разному и имеют разную семантику.
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"
}
Характеристика | PUT | PATCH |
---|---|---|
Действие | Полная замена ресурса | Частичное обновление |
Тело запроса | Содержит ресурс целиком | Содержит только изменения |
Идемпотентность | Всегда идемпотентен | Может быть неидемпотентным |
Основное применение | Обновление всего объекта | Изменение отдельных полей |