Ответ
Оба метода используются для обновления ресурсов, но с разной семантикой.
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: Для оптимизации трафика и атомарного обновления отдельных полей (например, смена аватара, обновление статуса).
Ответ 18+ 🔞
Так, слушай, разберём эту дичь с PUT и PATCH, а то народ путается, как слепые котята в парадном подъезде.
Вот представь: у тебя есть пользователь, целая сущность, файл, настройка — короче, ресурс. И его надо обновить. И тут тебе на выбор два инструмента: здоровенный кувалда PUT и хирургический лазер PATCH. Выглядят похоже, а нахуяриться ими можно по-разному.
PUT — это как сказать: «На, засранец, вот тебе НОВАЯ ВЕРСИЯ, целиком! Забудь, что было!»
- Суть: «Положи ресурс вот на этот URL». Ты должен отправить всё, блядь, целиком, всё его новое состояние.
- Идемпотентность: Абсолютно. Сколько раз ни долби — если данные одни и те же, результат будет одинаковый. Как стучать головой в стену: десятый раз так же больно, как и первый.
- Подводный камень, ёпта: Если ты в своей «новой версии» забыл какое-то поле — сервер честно его уберёт нахуй. Считает, раз ты не прислал — значит, тебе оно не нужно. Пиздец полный.
PATCH — это как шепнуть на ушко: «Слышь, братан, поменяй-ка вот это одно поле, остальное не трогай».
- Суть: «Примени заплаточку, патчик». Кидаешь только то, что хочешь поменять.
- Идемпотентность: Хуй его знает. Зависит от того, как сервер эту заплатку реализовал. Если он тупой, то десять одинаковых заплат могут нахуярить десять изменений.
- Главный плюс: Что не тронул — то и осталось жить-поживать. Ничего не пропадёт.
Смотри, как это работает на живом примере (чтоб совсем пиздец понятно стало):
Допустим, на сервере лежит пользователь:
{
"id": 1,
"name": "Василий",
"email": "vasya@derevnya.ru",
"age": 25
}
Тебе надо имя поменять на «Василий Пупкин».
-
Если ты лоботряс и используешь PUT:
PUT /users/1 { "name": "Василий Пупкин", "email": "vasya@derevnya.ru" }И что получаешь? Сервер видит: «О, поле
ageне прислали. Значит, хуй с ним, удаляем!». Итог:{"id":1, "name":"Василий Пупкин", "email":"vasya@derevnya.ru"}. Возраст сгинул в небытие! Василий стал агаeless! Ебать ты гений! -
Если ты не мудак и используешь PATCH:
PATCH /users/1 { "name": "Василий Пупкин" }Сервер: «Ага, понял. Меняем имя, всё остальное — по старому». Итог:
{"id":1, "name":"Василий Пупкин", "email":"vasya@derevnya.ru", "age": 25}. Возраст на месте, почта на месте, все довольны.
Так когда что юзать, чтобы не выглядеть конченым идиотом?
- PUT: Когда ты полностью контролируешь весь ресурс и меняешь его целиком. Сохранение черновика статьи, замена всей конфигурации устройства, обновление аватара (отправляя новый файл). Полная замена, блядь.
- PATCH: Когда надо точечно тыкнуть, сэкономить трафик и не сломать то, что менять не планировал. Сменить статус заказа с «новый» на «в работе», обновить только номер телефона в профиле, добавить тег к посту.
Короче, думай головой, что ты делаешь: переписываешь книгу от корки до корки (PUT) или исправляешь опечатку на пятой странице (PATCH). Осознанный выбор спасёт тебя от ебанины, когда у половины пользователей в базе вдруг поле isActive стало null.