DELETE
Применение
Запрос DELETE предписывает серверу удалить целевой ресурс. Что именно означает удаление на практике, решает сервер: ресурс может быть стёрт безвозвратно, помещён в архив или помечен как неактивный.
REST API активно опираются на DELETE для обозначения уничтожения ресурса. Конечная точка API вида DELETE /api/users/123 чётко выражает намерение удалить запись пользователя с идентификатором 123. Это напрямую соответствует паттерну PUT/POST/GET/DELETE для операций создания, обновления, чтения и удаления.
HTML-формы поддерживают только GET и POST. JavaScript-интерфейсы вроде fetch и XMLHttpRequest поддерживают DELETE изначально. Некоторые фреймворки в качестве обходного пути используют POST с параметром _method=DELETE.
Сервер отвечает одним из нескольких кодов состояния в зависимости от результата:
Жёсткое удаление безвозвратно уничтожает ресурс. Последующие запросы GET возвращают 404 или 410 Gone. Мягкое удаление помечает ресурс как неактивный, не удаляя сами данные. Ресурс остаётся доступен через административный API или с помощью параметра запроса. 410 сообщает о безвозвратном удалении, а 404 уместен, когда ресурса по данному URI больше не существует.
Запрос DELETE идемпотентен. Многократная отправка одного и того же запроса приводит сервер в то же состояние, что и однократная. Первый запрос удаляет ресурс, последующие дополнительного эффекта не дают. Коды ответа при этом могут различаться: первый запрос возвращает 200 OK или 204 No Content, а последующие — 404 Not Found или 410 Gone.
Удаление ресурса
Клиент запрашивает удаление конкретного файла. Сервер удаляет файл и отвечает кодом 204 No Content, подтверждая действие без тела сообщения.
Запрос
DELETE /uploads/report.pdf HTTP/1.1
Host: api.example.re
Ответ
HTTP/1.1 204 No Content
Удаление через REST API с подтверждением
REST API возвращает 200 OK с телом в формате JSON, подтверждающим удаление и указывающим удалённый ресурс.
Запрос
DELETE /api/users/123 HTTP/1.1
Host: api.example.re
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9...
Ответ
HTTP/1.1 200 OK
Content-Type: application/json
{"deleted": true, "id": 123}
Заголовок Authorization несёт bearer-токен, поскольку большинство API требуют аутентификации, прежде чем разрешить разрушительные операции.
CORS
Межсайтовые запросы DELETE всегда вызывают предварительный запрос CORS. Браузер сначала отправляет запрос OPTIONS, чтобы убедиться, что сервер разрешает DELETE для целевого ресурса.
Тело запроса и ответа
Запросы DELETE могут содержать тело, но его семантика не определена. Некоторые промежуточные узлы отклоняют запросы DELETE с телом из-за рисков подмены запросов (request smuggling). Большинство API не используют тело запроса для DELETE. Когда тело всё же нужно, например для массового удаления, ожидаемый формат определяет сервер.
Тело ответа зависит от кода состояния. Ответ 200 OK содержит тело, описывающее результат или возвращающее удалённый ресурс. Ответ 204 No Content подтверждает удаление без тела. Ответ 202 Accepted указывает, что удаление поставлено в очередь или выполняется, и обычно включает ссылку на монитор состояния.
Коды состояния ответа
204 No Content — самый частый ответ для простых удалений, когда тело не требуется. 200 OK уместен, когда сервер возвращает в теле ответа удалённый ресурс или подтверждающее сообщение.
202 Accepted сигнализирует, что удаление поставлено в очередь или выполняется асинхронно. Ответ обычно содержит заголовок Location или тело, указывающее на конечную точку состояния, где клиент проверяет ход выполнения.
Последующие запросы к удалённому ресурсу возвращают 404 Not Found или 410 Gone. Ответ 410 означает, что ресурс существовал ранее и был намеренно удалён, тогда как 404 такого различия не проводит.