Ответ
HTTP методы PUT и POST используются для взаимодействия с ресурсами в REST API, но имеют разные семантики и предназначение:
-
PUT(Полное обновление или создание с известным URI)- Используется для полного обновления существующего ресурса или создания нового, если клиент заранее знает его полный URI.
- Идемпотентен: Многократное выполнение одного и того же
PUT-запроса приводит к одному и тому же состоянию на сервере. Это обеспечивает безопасность при повторных попытках запроса (например, при сетевых ошибках). -
Пример: Обновление данных пользователя с ID
123.PUT /users/123 Content-Type: application/json { "name": "John Doe", "email": "john.doe@example.com" }Если ресурс
/users/123не существует,PUTможет его создать (если сервер поддерживает такую логику).
-
POST(Создание нового ресурса или выполнение операции)- Используется для создания нового ресурса, когда его URI определяется сервером (например, при добавлении элемента в коллекцию).
- Также применяется для выполнения неидемпотентных операций или отправки данных, которые не подходят под другие HTTP-методы (например, отправка формы, запуск процесса, выполнение сложной транзакции).
- Неидемпотентен: Повторные
POST-запросы могут создавать дубликаты ресурсов или вызывать побочные эффекты, так как каждый запрос рассматривается как новая операция. -
Пример: Создание нового пользователя.
POST /users Content-Type: application/json { "name": "Alice Smith", "email": "alice.smith@example.com" }Сервер ответит статусом
201 Createdи заголовкомLocation, указывающим на URI нового ресурса (например,/users/456).
Ключевые различия:
- Идемпотентность:
PUTидемпотентен,POST— нет. - URI ресурса:
PUTтребует, чтобы клиент знал полный URI ресурса.POSTобычно отправляется на URI коллекции, и сервер генерирует URI нового ресурса. - Назначение:
PUT— для замены/обновления ресурса целиком.POST— для создания нового ресурса или выполнения операций, не подходящих под другие глаголы. - Возвращаемый статус:
PUTчасто возвращает200 OKили204 No Content.POSTобычно возвращает201 Createdс заголовкомLocation. - Частичное обновление: Для частичного обновления ресурса рекомендуется использовать метод
PATCH.PUTподразумевает отправку полного представления ресурса.
Ответ 18+ 🔞
Так, слушай, вот тебе про PUT и POST, а то некоторые их как сиамских близнецов используют, нихуя не понимая, в чём разница. Это ж как молоток и отвёртка — общее назначение похожее, а сука, приложение разное.
Вот смотри, PUT — это такой максималист, блядь. Он приходит и говорит: «На месте ресурса по адресу /users/123 должно быть ТОЛЬКО ТО, что я тебе сейчас передам. Всё старое — нахуй в помойку». Он идемпотентный, ёпта. Это значит, что если ты его десять раз подряд отправишь с одним и тем же телом — на сервере хуйня не случится, состояние будет одно и то же. Как гвоздь забивать — десятый раз уже ничего не изменится. Идеально для повторов, если сеть глючит.
PUT /users/123
Content-Type: application/json
{
"name": "Иван Петров",
"email": "ivan@example.com"
}
Тут логика такая: «Эй, сервер, по адресу /users/123 должен лежать ровно этот чувак. Если его нет — создай, если есть — полностью перепиши, сука». Всё просто, как три копейки.
А теперь POST — это уже другой коленкор, блядь. Это не идемпотентный засранец. Он как раз для того, чтобы создать что-то новое, чей адрес заранее не известен. Ты шлёшь его обычно в коллекцию, типа /users, и говоришь: «Слушай, прими этого нового персонажа, определи ему ID сам и скажи, где он теперь живёт».
POST /users
Content-Type: application/json
{
"name": "Анна Сидорова",
"email": "anna@example.com"
}
Сервер тут: «Ага, понял. Создал. Вот его новый пропуск — /users/789. Забирай». И вернёт тебе статус 201 Created с заголовком Location. А если ты этот POST случайно ещё раз отправишь — он создаст второго такого же Анну, и будет у тебя клон, пиздец. Не идемпотентно, вот в чём соль.
Короче, резюмирую, чтобы в голове осело:
PUT— «Вот адрес, вот данные. Сделай так, чтобы по этому адресу было именно это. Всё остальное — нахуй». Идемпотентный, безопасный для повторов.POST— «Вот данные, придумай им место и дай пропуск». Не идемпотентный, каждый новый запрос — потенциально новый ресурс или действие.
И да, запомни ещё одну важную хуйню: если тебе нужно частично обновить ресурс (только email поменять, например), то PUT не катит — он требует всю сущность целиком. Для этого есть PATCH, но это уже другая история, про которую можно отдельно охуеть.