Ответ
PUT полностью заменяет ресурс новыми данными. Если какие-то поля не указаны в запросе, они будут удалены. PUT является идемпотентным — повторные одинаковые вызовы дают один и тот же результат.
PATCH частично обновляет ресурс, изменяя только указанные поля. Остальные поля остаются без изменений. PATCH не является идемпотентным по умолчанию, так как последовательность разных PATCH-запросов может приводить к разным конечным состояниям.
Пример PUT (полная замена):
PUT /api/users/123
Content-Type: application/json
{
"email": "new@example.com"
// Поле "name" будет удалено, если не указано
}
Пример PATCH (частичное обновление):
PATCH /api/users/123
Content-Type: application/json
{
"email": "new@example.com"
// Поле "name" останется неизменным
}
Практическое правило: Используйте PUT, когда клиент может и должен отправить полное представление ресурса. Используйте PATCH для точечных обновлений, особенно для больших объектов.
Ответ 18+ 🔞
Давайте разберем эту дичь с PUT и PATCH, а то у некоторых в голове после этого каша, как у Герасима после утопления Муму, блядь.
Смотри, есть у тебя пользователь в базе — цельная сущность, как тот самый здоровенный немой дворник. Допустим, он выглядит так:
{
"id": 123,
"name": "Герасим",
"email": "gerasim@dvor.ru",
"role": "дворник"
}
PUT — это когда ты приходишь и говоришь: "Всё, старый мир говно, делаем по-новому, нахуй!" Ты присылаешь ПОЛНОСТЬЮ НОВОГО пользователя. Что не указал — того и не будет, сгорит в аду. Идемпотентный он, потому что сколько раз ни пришли и ни сказали "делаем вот так" — результат один и тот же, ебать.
PUT /api/users/123
Content-Type: application/json
{
"email": "newboss@example.com"
}
И что получается? А получается пиздец! Ты же только email отправил. Сервер думает: "А, ну окей, видимо, у пользователя теперь ТОЛЬКО почта, а имени и роли — хуй с горы". И записывает:
{
"id": 123,
"email": "newboss@example.com"
// Полей name и role больше нет. Их съели.
}
PATCH — это хитрая жопа. Ты подкрадываешься и шепчешь: "Слушай, брат, давай-ка только почту поменяем, а всё остальное пусть будет как есть, а?"
PATCH /api/users/123
Content-Type: application/json
{
"email": "newboss@example.com"
}
И тут сервер, такой: "О, окей, понял тебя, чувак". И меняет ТОЛЬКО почту, не трогая остальное:
{
"id": 123,
"name": "Герасим", // На месте!
"email": "newboss@example.com", // Обновилось!
"role": "дворник" // Тоже на месте!
}
Так когда что использовать, ёпта?
- PUT — когда ты с фронта держишь ВСЕ данные объекта и точно знаешь, как он должен выглядеть ПОЛНОСТЬЮ. Например, страница редактирования профиля, где все поля. Отправил — и бабах, всё заменилось.
- PATCH — для точечных, хитрожопых обновлений. Сменил аватарку, подписался на рассылку, поставил лайк. Незачем гонять весь объект весом в овердохуища гигабайт, чтобы поменять одно поле
liked: true. Отправил патч — и свободен.
И да, запомни: PUT — идемпотентный, PATCH — обычно нет. Потому что если ты десять раз шлёшь один и тот же PUT — нихуя не изменится. А если десять раз шлёшь PATCH "увеличить счётчик на 1" — он каждый раз увеличится, и будет тебе десять, а не один. Вот такая, блядь, математика.
Короче, не будь как тот князь, который сразу "мочить, блядь". Подумай, что тебе нужно: переписать всю историю с нуля (PUT) или просто подправить концовку (PATCH).