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

Ответ

Это стандартные HTTP-методы, определяющие действие над ресурсом в RESTful API.

Метод Назначение (CRUD) Свойства
GET Read (Чтение). Получение данных. Безопасный, Идемпотентный.
POST Create (Создание). Создание нового ресурса. Не безопасный, Не идемпотентный.
PUT Update (Обновление). Полная замена ресурса по известному URI. Не безопасный, Идемпотентный.
PATCH Update (Частичное обновление). Изменение части ресурса. Не безопасный, Не гарантирует идемпотентность (но должен быть по спецификации).
DELETE Delete (Удаление). Удаление ресурса. Не безопасный, Идемпотентный.

Ключевые различия PUT vs PATCH:

  • PUT требует от клиента отправить полное представление ресурса, даже если меняется одно поле. Сервер полностью заменяет ресурс предоставленными данными.
  • PATCH отправляет только изменяемые поля. Сервер применяет частичные изменения.

Примеры:

# Получить статью
GET /articles/1

# Создать статью
POST /articles
Body: {"title": "New", "text": "..."}

# Полностью обновить статью (все поля обязательны)
PUT /articles/1
Body: {"title": "Updated", "text": "New full text"}

# Частично обновить статью (только заголовок)
PATCH /articles/1
Body: {"title": "New Title"}

# Удалить статью
DELETE /articles/1

Примечание: UPDATE не является стандартным HTTP-методом. В HTTP для обновления используются PUT или PATCH.

Ответ 18+ 🔞

Слушай, ну это ж классика, про которую все вроде как знают, но потом на собеседовании просят объяснить разницу между PUT и PATCH, а у человека глаза стекленеют, и он начинает нести хуйню про "ну это почти одно и то же, но PUT — это типа сильнее". Пиздец.

Короче, смотри, есть у нас эта ваша REST API, и там методы как команды для сервера. Представь, что ресурс — это файл на компе.

GET — это как открыть файл и прочитать. Только читаешь, нихуя не трогаешь. Безопасно, идемпотентно (сколько раз ни открывай — файл тот же). GET /статья_про_Муму.txt.

POST — это создать новый файл с нуля. Кидаешь на сервер данные, он говорит: "О, новый ресурс, ёпта!", создаёт его и присваивает ему новый адрес (URI). Не безопасный (меняет что-то), не идемпотентный (отправишь два одинаковых запроса — получишь два новых файла, близнеца-брата). POST /статьи + тело {"title": "Про Герасима"}.

А теперь, внимание, ебушки-воробушки, главная путаница!

PUT — это не "обновить", а полностью заменить файл по известному адресу. У тебя есть статья_про_Муму.txt. Ты говоришь: "Сервер, нахуй старое, вот тебе НОВЫЙ, ПОЛНЫЙ текст статьи". Если в новом тексте только заголовок поменял, а про собаку забыл — сервер тупо возьмёт и заменит старый файл этим урезанным. Собака, блядь, исчезнет! Не безопасный, но идемпотентный (сколько раз ни отправляй один и тот же полный файл — результат будет одинаковый).

PATCH — это вот оно, точечное обновление. "Сервер, в файле статья_про_Муму.txt в третьем абзаце слово 'утопил' замени на 'обнял и отпустил в лес', а всё остальное оставь как есть". Отправляешь только инструкцию, что менять. Теоретически тоже должен быть идемпотентным, но на практике, если инструкция кривая, можно и наебнуться. Не безопасный.

DELETE — ну тут всё ясно, удалить файл. Не безопасный, но идемпотентный (удалил — и хуй с ним, второй раз удалять уже нечего).

И главное запомни: UPDATE — это НЕ стандартный HTTP-метод, его не существует! Это просто слово из SQL. В HTTP для обновления есть только PUT (полная замена) и PATCH (латка).

Вот, смотри на примерах, чтобы вротберунчик не сводило:

# Прочитать, что там с Муму (надеюсь, жива)
GET /articles/1

# Написать новую статью про какого-нибудь Пиноккио
POST /articles
Body: {"title": "Пиноккио", "text": "Деревянный, нос растёт..."}

# Решил, что статья про Муму — пиздец мрак, хочу заменить её на весёлую сказку про репку
PUT /articles/1
Body: {"title": "Репка", "text": "Посадил дед репку..."} # Всё, Муму нет, только репка!

# Ой, бля, передумал. Пусть статья всё же про Муму, но исправлю конец на хэппи-энд.
PATCH /articles/1
Body: {"text": "И Герасим не утопил Муму, а они вместе уехали в деревню и завели огород."} # Меняю только текст, заголовок остаётся "Репка", потому что PUT-ом его нахуй заменил, мудя!

# Всё, заебал этот трагизм, удаляю всё к хуям.
DELETE /articles/1

Вот и вся магия. Главное — не путай PUT и PATCH, а то вместо обновления заголовка всю статью в пизду сотрёшь, и потом будешь сидеть и думать: "Что же я, мудак, сделал?".