Что такое HTTP-метод PUT в REST API?

Ответ

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. И не путай, а то сервер тебе такого наебнёт, что мало не покажется. Всё, я пошёл, кофе допивать.