Ответ
Оба метода используются для обновления ресурсов, но с разной семантикой, что критично для проектирования идемпотентных и предсказуемых RESTful API.
-
PUT— полная замена ресурса. Клиент отправляет полное представление ресурса. Сервер должен полностью заменить целевой ресурс присланными данными. Любые поля, не указанные в запросе, должны быть трактованы какnullили значения по умолчанию.PUTявляется идемпотентным (многократный одинаковый запрос дает тот же результат). -
PATCH— частичное обновление ресурса. Клиент отправляет только те поля, которые необходимо изменить, и инструкции по их изменению (например, в формате JSON Patch). Сервер применяет эти изменения к существующему ресурсу. Остальные поля остаются нетронутыми.PATCHне обязательно идемпотентен (зависит от типа операции в теле запроса).
Примеры: Допустим, у нас есть ресурс пользователя:
// GET /users/123
{
"id": 123,
"name": "Alice",
"email": "alice@example.com",
"age": 30
}
Запрос PUT для обновления имени:
PUT /users/123
Content-Type: application/json
{
"name": "Alice Smith"
}
Результат после PUT: Поля email и age будут удалены, так как не были переданы! Ресурс станет {"id": 123, "name": "Alice Smith"}.
Запрос PATCH для обновления имени (используя JSON Merge Patch):
PATCH /users/123
Content-Type: application/json
{
"name": "Alice Smith"
}
Результат после PATCH: Только поле name изменится. Ресурс станет {"id": 123, "name": "Alice Smith", "email": "alice@example.com", "age": 30}.
Когда использовать:
- Используйте
PUT, когда клиент имеет полный контроль над ресурсом и может/должен отправлять его полное состояние (например, редактирование профиля через форму). - Используйте
PATCH, когда нужно обновить одно-два поля, чтобы уменьшить трафик и избежать риска случайного перезатирания других данных (например, смена аватара или настройки уведомлений).
Ответ 18+ 🔞
Да ты посмотри, какая тонкая хуйня, а! Просто пиздец, как важно не перепутать, а то потом сидишь и чешешь репу: "Почему у меня у юзера почта схуяли пропала, блядь?"
Ну, слушай сюда, распишу как для дебила, но ты не обижайся, просто тема такая, ёпта.
Вот представь, у тебя есть пользователь, целая сущность, как карточка в базе. И ты её, блядь, обновить захотел.
PUT — это как взять и выебать мозг. Полностью, нахуй. Ты приходишь с НОВОЙ карточкой и говоришь: "Всё, старая — в мусорку, хуй с ней. Вот эта новая — теперь истина в последней инстанции, блядь". Если в новой карточке ты указал только имя, то всё остальное — почта, возраст, любимый цвет — обнуляется, стирается, идёт нахуй. Потому что ты прислал ПОЛНОЕ состояние. И сколько раз ни присылай одно и то же — результат будет одинаковый, это и есть идемпотентность, ебать её в сраку.
PATCH — это как хирургическая операция, блядь. Ты не трогаешь всю карточку. Ты говоришь: "Слушай, братан-сервер, вот тут у меня в поле 'имя' опечатка, исправь её на 'Алиса Смит', а всё остальное не трогай, оно и так норм". И сервер такой: "Окей, понял тебя, чувак", и аккуратно меняет только то, что попросили. И трафика меньше, и риска нихуя не сломать то, что не надо.
Вот смотри на примере, а то я уже заебался объяснять:
Был у нас юзер:
{
"id": 123,
"name": "Alice",
"email": "alice@example.com",
"age": 30
}
Если ты такой умный и сделал PUT:
PUT /users/123
Content-Type: application/json
{
"name": "Alice Smith"
}
И что мы имеем, блядь? А имеем мы пиздец! Ты же прислал только имя! Сервер честно, как идиот, заменил ВСЮ запись на то, что ты дал. И теперь у Алисы нет ни почты, ни возраста. Просто {"id": 123, "name": "Alice Smith"}. Поздравляю, ты её обезличил, мудак!
А если бы ты сделал PATCH, хитрая жопа:
PATCH /users/123
Content-Type: application/json
{
"name": "Alice Smith"
}
Вот тут сервер умный, он смотрит: "Ага, чувак хочет поменять только имя. Ну окей". И меняет ТОЛЬКО имя. И всё остальное — почта, возраст — остаётся на месте, живёт себе спокойно. Идеально, блядь!
Короче, вывод, чтобы в голове отложилось:
- PUT — когда ты БОГ и знаешь ВСЁ состояние ресурса. Полная замена, пиздец и точка. Используй для полных форм редактирования.
- PATCH — когда ты ленивая жопа и не хочешь тащить все поля, или когда нужно точечно тыкнуть одно значение. Частичное обновление, чтобы не выстрелить себе в ногу.
Вот и вся философия, ебушки-воробушки. Выбирай с умом, а то потом пользователи начнут жаловаться, что у них данные худеют непонятно как.