Какой HTTP-метод REST используется для удаления сущности?

Ответ

Для удаления сущности в REST API используется HTTP-метод DELETE.

Ключевые характеристики:

  • Идемпотентный: Повторные идентичные запросы к одному и тому же ресурсу приводят к одному и тому же результату (ресурс остаётся удалённым).
  • Безопасный: Нет, метод изменяет состояние на сервере.

Типичная реализация и статусы ответа:

@DeleteMapping("/users/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
    userService.deleteById(id);
    return ResponseEntity.noContent().build(); // 204 No Content
}
  • Успех (ресурс удалён): Возвращают статус 204 (No Content) без тела ответа.
  • Ресурс не найден: Можно вернуть 404 (Not Found).
  • Запрещено: 403 (Forbidden) или 401 (Unauthorized).

Примечание: Для массового или условного удаления иногда используют POST с телом запроса, так как DELETE обычно не должен содержать тело.

Ответ 18+ 🔞

А, ну ты смотри, опять про эту вашу REST-ную магию. Ну ладно, слушай сюда, раз уж начал.

Вот представь, есть у тебя сущность, какая-нибудь, ну, пользователь там. И ты такой: "Нахуй его, этот ресурс, не нужон он мне больше!" Как ты с сервером это обсудишь? Правильно, методом DELETE. Это как прийти в гости и выкинуть нахуй чужой кактус с подоконника. Раз — и нет кактуса.

Что про него важно помнить, чтобы не облажаться:

  • Идемпотентный, ёпта: Это умное слово значит, что если ты десять раз подряд нажмёшь кнопку "удалить Петю", то Петя удалится один раз, а не десять. После первого раза его уже нет, и следующие девять запросов просто упрутся в пустоту. Результат один и тот же — Пети нет. Удобно же, а?
  • Безопасный? Да хуй там! Конечно нет. Это ж изменение, блядь. Состояние сервера поменялось — ресурс сгинул в небытие. Это не как GET, который только смотрит.

Как это обычно выглядит в коде, если ты не совсем долбоёб:

@DeleteMapping("/users/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
    userService.deleteById(id);
    return ResponseEntity.noContent().build(); // 204 No Content
}

Смотри, что тут происходит: ты говоришь — "эй, сервак, удали юзера с таким-то айди". Сервисный слой идёт и делает свои грязные делишки в базе. А потом мы возвращаем ответ: 204 No Content. Это как кивнуть головой: "Всё, братан, сделано, Петю больше нет, даже говорить не о чем". Тела ответа нет — и не надо.

А если пошло по пизде? Ну, бывает:

  • Ресурс не найден: Ты просишь удалить Петю с айди 999, а такого Пети никогда и не было. Можно вернуть 404 (Not Found). Типа, "чё удалять-то, мудила? Его нет!".
  • Запрещено: Ты — юзер, а пытаешься удалить админа. Сервер тебе: 403 (Forbidden) или 401 (Unauthorized). "Иди нахуй, мелкий, не твоего ума дело".

И вот ещё важный момент, а то щас начнёшь выёбываться: Для массового удаления или сложных условий DELETE — не всегда царь и бог. Потому что по канонам, в DELETE не принято пихать тело запроса. Это как кричать "УБЕРИ ЭТО!" — не важно, как убрать, главное — убери. Поэтому если тебе надо удалить не просто по айди, а, например, всех, кто зарегался до вчера и имя которых начинается на "Ху", то часто используют POST на какой-нибудь /users/delete с телом, где эти условия описаны. Это уже такой, знаешь, читерский манёвр, но жизнь, блядь, сложная штука.

Короче, DELETE — это просто и ясно. Нашёл ресурс — пристрелил. Главное, целиться точно, а то по ошибке продакшен-базу почистишь, потом будешь охуевать.