Ответ
POST, PUT и PATCH — это HTTP-методы для операций с ресурсами в REST API.
POST — Создание
Создаёт новый ресурс. Клиент не указывает конечный URI ресурса.
POST /users HTTP/1.1
Content-Type: application/json
{"name": "John"}
HTTP/1.1 201 Created
Location: /users/123
PUT — Полное обновление/Создание
Полностью заменяет ресурс по указанному URI. Если ресурса нет — создаёт его. Требует передачи всех полей.
PUT /users/123 HTTP/1.1
Content-Type: application/json
{"name": "John", "age": 30}
HTTP/1.1 200 OK
PATCH — Частичное обновление
Применяет частичные модификации к ресурсу. Отправляются только изменяемые поля.
PATCH /users/123 HTTP/1.1
Content-Type: application/json
{"age": 31}
HTTP/1.1 200 OK
| Сравнительная таблица: | Метод | Семантика | Идемпотентность | Передача данных | Типичный код ответа |
|---|---|---|---|---|---|
| POST | Создание нового ресурса | Нет | Полный/частичный объект | 201 Created |
|
| PUT | Полная замена ресурса | Да | Полный объект | 200 OK / 204 No Content |
|
| PATCH | Частичное обновление ресурса | Может быть нет* | Только изменяемые поля | 200 OK |
*PATCH не гарантирует идемпотентность по умолчанию, но её можно реализовать (например, используя JSON Patch с операциями
replace).
Ответ 18+ 🔞
А, слушай, вот эта вся хуйня с POST, PUT и PATCH! Ну, это ж классика, блядь, вечный повод для пиздеца на собеседованиях. Сейчас разжую, как есть, чтобы ты не был, как тот Герасим, который нихуя не говорит, а только «Му-му».
POST — это типа «роди, блядь, нового».
Вот приходит клиент и говорит: «Слушай, а сделай-ка мне нового юзера, я тебе данные кину». И он нихуя не знает, какой там будет айдишник. Он просто швыряет запрос в общую дырку /users и молится. Сервер, такой: «Ага, щас, сука, придумаю тебе айди 123, запихуну в базу и отпишу: «На, мудила, держи, родил тебе, вот адресок».
Короче, создание. Каждый раз — новый ресурс. Идемпотентность? Да ну нахуй, нет её тут. Два раза отправишь — два пользователя получишь, если не поставить защиту. Типичный ответ — 201 Created, и в заголовках Location тыкают, где этого новорождённого искать.
POST /users HTTP/1.1
Content-Type: application/json
{"name": "John"}
HTTP/1.1 201 Created
Location: /users/123
PUT — это «заебись, сейчас я тебе всё перепишу нахуй».
Тут уже клиент — царь и бог. Он говорит: «На адрес /users/123 я хочу, чтобы лежало ТОЧНО вот это: имя Джон, возраст 30. Если там ничего нет — создай. Если есть — выкинь нахуй старое и положи моё». Это полная замена, ёпта! Ты обязан передать ВСЕ обязательные поля, а не какую-то хуйню. Идемпотентность? Абсолютная! Десять раз шлёшь одно и то же — результат как после первого раза. Ответ обычно 200 OK или 204 No Content.
PUT /users/123 HTTP/1.1
Content-Type: application/json
{"name": "John", "age": 30}
HTTP/1.1 200 OK
PATCH — это «ой, да ладно, я только возраст поправлю».
Вот это, блядь, для ленивых или умных — как посмотреть. Не хочешь тащить весь объект обратно? Шли только то, что меняется. «Слушай, у юзера 123 сделай возраст 31, а всё остальное не трогай, оно и так норм». Удобно, экономично. Но вот с идемпотентностью — засада, ёпта! По умолчанию — нет. Потому что если ты два раза шлёшь «увеличь счётчик на 1», то он увеличится два раза. Но если сделать по-умному, через JSON Patch с операцией replace, то можно и идемпотентность добиться. Ответ — 200 OK.
PATCH /users/123 HTTP/1.1
Content-Type: application/json
{"age": 31}
HTTP/1.1 200 OK
А вот тебе табличка, чтобы вообще мозг не ебать:
| Метод | Что делает? | Идемпотентный? | Что шлёшь? | Что в ответе? |
|---|---|---|---|---|
| POST | Создаёт нового | Нет, блядь | Весь объект или часть | 201 Created |
| PUT | Меняет всё нахуй | Да, абсолютно | Полный объект | 200 OK / 204 |
| PATCH | Чинит по мелочи | Обычно нет* | Только то, что меняешь | 200 OK |
*PATCH, сука, может быть идемпотентным, если делать его не как попало, а по спецификации JSON Patch. Но это уже высший пилотаж, на собеседовании про это спросят, только если интервьюер — пидарас шерстяной.
Вот и вся разница, блядь. POST — роди, PUT — перепиши, PATCH — подлатай. Главное — не перепутай, а то накосячишь, и потом будешь, как тот Герасим, метаться и орать «Му-му!», когда поймёшь, что наебнул данные в продакшене.