Ответ
PUT — это идемпотентный HTTP-метод для полного обновления ресурса по указанному URI. Он заменяет все текущие представления ресурса данными из запроса.
Ключевые характеристики:
- Полная замена: Тело запроса должно содержать новое полное состояние ресурса.
- Идемпотентность: Многократный вызов с одними данными даёт тот же результат, что и однократный.
- Создание ресурса: Если ресурс по указанному URI не существует, сервер может создать его (обычно с ответом
201 Created). Это зависит от реализации API.
Пример запроса:
PUT /api/users/123 HTTP/1.1
Host: example.com
Content-Type: application/json
{
"name": "Alice",
"email": "alice@example.com"
}
Типичные коды ответов:
200 OK— обновление успешно.201 Created— ресурс был создан.204 No Content— обновление успешно, тело ответа не передаётся.
| Отличие от PATCH: | PUT | PATCH |
|---|---|---|
| Заменяет весь ресурс. | Обновляет только указанные поля (частичное обновление). | |
| Всегда идемпотентен. | Идемпотентность не гарантирована спецификацией. | |
| Клиент должен знать полное состояние. | Клиент отправляет только изменяемые данные. |
Ответ 18+ 🔞
Давай разберём эту штуку, а то я тут сижу, кофе остывает, и думаю — какого хуя люди путают PUT и PATCH? Ну, ладно, слушай сюда, сейчас всё разжуём.
Представь, что у тебя есть анкета, бумажная такая, в отделе кадров. Вся заполнена: имя, должность, зарплата, любимый цвет, размер ботинок — всё, блядь, до запятой.
И вот ты приходишь с новой бумажкой и говоришь: «На, замените вот эту старую на мою новую, полную». Это и есть PUT, ёпта! Ты не говоришь: «Измените только зарплату». Ты говоришь: «Вот новая анкета, целиком, от корки до корки, забудьте старую». Если анкеты на тебя раньше не было — её создадут. Если была — перепишут. И сколько раз ни приноси одну и ту же бумажку — результат будет одинаковый. Это и есть идемпотентность, блядь, не пугайся слова, это просто значит «повторение не меняет хуйни».
А теперь смотри, как это в коде выглядит. Вот тебе пример, не трогаем его, он святой:
PUT /api/users/123 HTTP/1.1
Host: example.com
Content-Type: application/json
{
"name": "Alice",
"email": "alice@example.com"
}
Ты говоришь серверу: «Эй, мудила, на адресе /users/123 должен лежать юзер. Вот его полные новые данные: имя Alice, почта alice@example.com. ВСЁ. Больше там нихуя нет. Любимый цвет? Не указал — значит, хуй с ним, удаляй. Размер ботинок? Не указал — нахуй, стирай». Сервер берёт и полностью заменяет старый ресурс этим JSON'ом. Всё, точка.
А что сервер может ответить?
200 OK— ну, типа, окей, обновил, держи подтверждение.201 Created— о, а такого юзера раньше не было! Я его, блядь, создал по твоему запросу, молодец.204 No Content— всё сделал, но тебе в ответе ничего не пришлю, иди нахуй, нечего тут смотреть.
А теперь, внимание, самое важное, где все ебутся — отличие от PATCH.
Смотри, если PUT — это принести новую анкету целиком, то PATCH — это прийти с корректором и сказать: «Знаете, в старой анкете в графе "Зарплата" исправьте 1000 на 1000000, а в графе "Любимый цвет" добавьте "цвет денег"». И всё. Остальное остаётся как было. PATCH — это точечные правки, хирургия, а не полная замена трупа.
Вот табличка, чтобы вообще не было вопросов:
| PUT | PATCH |
|---|---|
| Меняет ВСЁ нахуй. | Меняет только то, что сказали. |
| Идемпотентен всегда. Как ни бей — результат один. | Идемпотентность не гарантирована. Можешь так залатать, что получишь ебаный винегрет. |
| Клиент должен знать ВСЁ состояние ресурса, как свои пять пальцев. | Клиент шлёт только то, что хочет поменять. Остальное — не его собачье дело. |
Короче, запомни: хочешь переписать всё с нуля — PUT. Хочешь подправить пару полей — PATCH. И не путай, а то сервер тебе такого наебнёт, что мало не покажется. Всё, я пошёл, кофе допивать.