Можно ли удалить сущность в базе данных, используя HTTP POST?

Ответ

Да, на уровне backend-логики это возможно, но это противоречит принципам REST и семантике HTTP.

Внутри обработчика POST-запроса можно выполнить любой код, включая SQL-запрос DELETE. Однако это создаёт путаницу в контракте API.

Проблемы использования POST для удаления:

  1. Нарушение идемпотентности: POST не является идемпотентным методом. Повторная отправка одного и того же запроса на удаление может привести к ошибке (например, "сущность не найдена") после первого успешного выполнения.
  2. Ухудшение читаемости API: Клиенты и разработчики ожидают, что DELETE означает удаление. POST — создание или сложное действие.
  3. Проблемы с кэшированием и стандартными инструментами.

Пример (нежелательная реализация):

POST /api/entity/remove HTTP/1.1
Content-Type: application/json

{"id": 456}

Правильная RESTful-альтернатива:

DELETE /api/entities/456 HTTP/1.1

Исключение — RPC-стиль API: Если ваше API построено в стиле Remote Procedure Call (RPC), где эндпоинты представляют собой действия (например, /removeEntity), то использование POST может быть оправдано. Но даже в этом случае лучше следовать общепринятым стандартам.

Ответ 18+ 🔞

Вот же ж, ну что за дичь, блядь! Технически-то, конечно, можно. Сидишь ты в своём POST-обработчике, и там хоть SQL на удаление, хоть файлы стирай, хоть сервер выключи — код выполнится, ёпта. Но это ж как взять молоток и гвозди, чтобы яйца всмятку варить — вроде инструмент в руках, но нахуя так издеваться?

Смотри, в чём тут пиздец:

  1. Идемпотентность, её в рот чих-пых! DELETE — он и в Африке DELETE. Отправил запрос — запись сдохла. Отправил его же ещё раз — ну, она уже сдохла, нихуя не изменилось, всё ок. А POST? Это как тыкать в кнопку «Старт» на микроволновке, когда там уже суп греется. Один раз нажал — суп греется. Второй раз нажал — микроволновка может охуеть и выдать ошибку «Бля, я уже работаю!», или, что хуже, начать новый отсчёт и всё испортить. Так и тут: первый POST удалил запись, второй — получил в ответ «404, сущность не найдена, иди нахуй». Не порядок.

  2. Читаемость API, блядь. Представь, заходит новый разработчик в проект, видит эндпоинт POST /api/killKitten. И думает: «О, наверное, это чтобы создать нового мёртвого котёнка? Или запустить процесс убийства?». А на деле там DELETE FROM kittens. Полный пиздец и волнение ебать. Все привыкли, что DELETE — значит удалить. Не надо выёбываться.

  3. Кэши, прокси, всякие умные системы — они на семантику HTTP заточены. DELETE — значит ресурс испарился, его можно из кэша выкинуть. А POST — нихуя не понятно, что случилось. Всё сломается, а потом будешь искать, почему.

Вот так делать — НЕ НАДО, блядь (но технически сработает):

POST /api/entity/remove HTTP/1.1
Content-Type: application/json

{"id": 456}

Выглядит как какая-то мартышлюшка, которая боится прямо сказать, что хочет удалить.

А вот так — ПРАВИЛЬНО, красиво и всем понятно:

DELETE /api/entities/456 HTTP/1.1

Кратко, ясно, семантично. Идиоматично, сука!

Хотя... есть одно «но», ебать мои старые костыли. Если у тебя весь API — это один большой RPC-стиль, где эндпоинты — это глаголы (/doSomething, /executeRemoval), то тогда да, POST — твой выбор. Но это уже не REST, а так, хитрая жопа какая-то. В 99% случаев лучше не умничать и использовать DELETE там, где нужно удалять. Не выёбывайся, короче.