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

«Можно ли удалить сущность в базе данных, используя HTTP POST?» — вопрос из категории HTTP и веб-протоколы, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, на уровне 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 может быть оправдано. Но даже в этом случае лучше следовать общепринятым стандартам.