Ответ
Основное различие заключается в способе обновления ресурса на сервере: PATCH применяет частичные изменения, а PUT полностью заменяет ресурс.
PUT
- Назначение: Полная замена существующего ресурса или создание нового по указанному URI.
- Идемпотентность: Да. Многократное выполнение одного и того же PUT-запроса приведет к тому же состоянию ресурса.
- Тело запроса: Должно содержать полную репрезентацию ресурса. Поля, не указанные в запросе, будут удалены или сброшены к значениям по умолчанию.
PATCH
- Назначение: Частичное обновление ресурса. Применяет только те изменения, которые переданы в теле запроса.
- Идемпотентность: Не обязательно. Два одинаковых PATCH-запроса могут привести к разным результатам (например,
PATCH { "operation": "increment", "field": "counter" }). - Тело запроса: Содержит только изменяемые поля.
Практический пример:
Допустим, на сервере есть ресурс пользователя:
// GET /users/1
{
"id": 1,
"username": "alex",
"email": "alex@example.com",
"is_active": true
}
1. Обновление с помощью PUT (меняем только is_active)
Чтобы изменить одно поле, мы должны отправить весь объект. Если мы отправим только {"is_active": false}, поля username и email будут утеряны.
PUT /users/1
Content-Type: application/json
{
"username": "alex",
"email": "alex@example.com",
"is_active": false
}
2. Обновление с помощью PATCH (меняем только is_active)
Мы отправляем только то поле, которое нужно изменить. Остальные поля остаются нетронутыми.
PATCH /users/1
Content-Type: application/json
{
"is_active": false
}
Вывод: Используйте PUT для полного замещения объекта и PATCH для экономичных и атомарных частичных обновлений, что снижает трафик и предотвращает случайную потерю данных.