В чем разница между HTTP-методами POST, PUT и PATCH?

Ответ

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 — подлатай. Главное — не перепутай, а то накосячишь, и потом будешь, как тот Герасим, метаться и орать «Му-му!», когда поймёшь, что наебнул данные в продакшене.