Ответ
Оба метода используются для обновления ресурсов, но с разной семантикой.
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: Для оптимизации трафика и атомарного обновления отдельных полей (например, смена аватара, обновление статуса).