Что делает HTTP-метод DELETE в RESTful API?

Ответ

Метод DELETE — это один из стандартных HTTP-методов, используемых в RESTful API для удаления ресурса, идентифицированного URI (Uniform Resource Identifier). Его ключевые характеристики — идемпотентность и отсутствие тела запроса.

  • Идемпотентность: Многократное выполнение одного и того же DELETE-запроса к одному и тому же ресурсу должно приводить к одному и тому же результату. После первого успешного удаления ресурс исчезает, и последующие запросы должны возвращать статус 404 Not Found или 410 Gone, но не вызывать ошибку сервера.
  • Без тела: Спецификация HTTP не запрещает тело в DELETE-запросе, но обычно оно не используется. Логика удаления должна определяться исключительно URI. Если нужны сложные условия, это часто указывает на дизайн RPC, а не REST.

Типичные коды ответов:

  • 204 No Content: Успешное удаление. Тело ответа отсутствует — это наиболее чистый и распространённый вариант.
  • 200 OK: Удаление прошло успешно, и сервер возвращает в теле ответа статус удалённого ресурса или дополнительную информацию (менее RESTful).
  • 202 Accepted: Запрос на удаление принят, но ещё не обработан (асинхронная операция).
  • 404 Not Found: Ресурс не найден по указанному URI (может считаться успехом с точки зрения идемпотентности, если ресурс уже был удалён).
  • 409 Conflict: Текущее состояние ресурса не позволяет выполнить удаление (например, есть зависимые сущности).

Пример использования с curl и в коде (JavaScript/fetch):

# Удаление пользователя с ID 123
curl -X DELETE https://api.example.com/v1/users/123 
     -H "Authorization: Bearer <token>"
// Удаление ресурса из клиентского JavaScript
async function deletePost(postId) {
    try {
        const response = await fetch(`/api/posts/${postId}`, {
            method: 'DELETE',
            headers: { 'Authorization': `Bearer ${token}` }
        });

        if (response.status === 204) {
            console.log('Post deleted successfully.');
            // Обновить UI: удалить элемент из списка
        } else if (response.status === 404) {
            console.log('Post already deleted or not found.');
        } else {
            console.error('Failed to delete post:', response.status);
        }
    } catch (error) {
        console.error('Network error:', error);
    }
}

Важное замечание по дизайну API: DELETE должен удалять именно тот ресурс, на который указывает URI. Удаление связанных ресурсов (каскадное удаление) должно быть явно документировано в контракте API, так как это может быть неочевидно для клиента и нарушать принцип наименьшего удивления.

Ответ 18+ 🔞

Давай разжую про этот ваш DELETE, а то некоторые думают, что это как мусорку вынести — кинул и забыл. На деле там, конечно, свои тонкости, ёпта.

В общем, представь, что у тебя есть шкаф с документами (это твой API). Метод DELETE — это когда ты берёшь папку с надписью «Вася Пупкин, договор №123» и отправляешь её в шреддер. Ключевых моментов два, запоминай:

  1. Идемпотентность, блядь. Звучит сложно, а смысл простой: сколько раз ни кидай одну и ту же папку в шреддер, результат будет одинаковый. Первый раз её уничтожит, а на второй, третий и десятый раз ты просто будешь смотреть на пустое место и думать: «Ну и хуй с ним, папки-то уже нет». В терминах API — после удаления следующие запросы должны возвращать «404 Не найдено», а не падать с ошибкой «ой, ты что, её уже удалил, идиот!». Доверия ебать ноль к таким API, которые орут на тебя за повторный запрос.
  2. Без тела запроса. Ну серьёзно, чувак. Ты же не пишешь на папке перед уничтожением эссе «Почему Вася Пупкин — мудак». Ты просто указываешь на неё (это URI) и говоришь: «Эту — нахуй». Вся логика удаления должна быть зашита в этот адрес. Если тебе для удаления нужно передать кучу параметров, типа «удалить, только если он блондин и родился в среду» — это уже не чистый REST, а какая-то пиздопроебибна с RPC.

Теперь, что сервер может тебе ответить, когда ты попытался что-то удалить:

  • 204 No Content — Идеально! Всё удалил, тебе в ответ — тишина и пустота в теле ответа. Красота.
  • 200 OK — Ну удалил и удалил, но вот, держи на память описание того, что только что стёр с лица сервера. Не самый элегантный, но жить можно.
  • 202 Accepted — «Лады, принял заявку на ликвидацию. Присядь, подожди, наши ребята из отдела «Д» всё обработают». Используется для долгих асинхронных удалений.
  • 404 Not Found — «Чувак, а удалять-то нечего, тут пусто». С точки зрения идемпотентности — это нормально, цель достигнута: ресурса нет.
  • 409 Conflict — Вот это уже интереснее. «Не могу удалить, потому что к этому пользователю привязаны 150 заказов, а ты, распиздяй, не указал, что делать с ними». Нужно либо каскадом всё грохнуть, либо сначала зависимости почистить.

Смотри, как это в деле выглядит. Вот тебе пример для командной строки:

# Шлём пользователя с id=123 в цифровой небыт
curl -X DELETE https://api.example.com/v1/users/123 
     -H "Authorization: Bearer <token>"

А вот как это может быть в твоём фронтенде на JavaScript:

// Функция для отправления поста в забвение
async function deletePost(postId) {
    try {
        const response = await fetch(`/api/posts/${postId}`, {
            method: 'DELETE',
            headers: { 'Authorization': `Bearer ${token}` }
        });

        if (response.status === 204) {
            console.log('Пост успешно стёрт в порошок.');
            // Тут надо бы и на интерфейсе его убрать, а то будет висеть как призрак
        } else if (response.status === 404) {
            console.log('Пост уже удалён или его никогда не существовало. Бывает.');
        } else {
            console.error('Не удалось удалить пост, сервер выдал:', response.status);
        }
    } catch (error) {
        console.error('Сеть подвела, бля:', error);
    }
}

И последнее, но охуенно важное замечание по дизайну. DELETE должен удалять ТОЛЬКО тот ресурс, на который ты указал. Если вместе с пользователем в тайне от клиента удаляются все его фото, комментарии и лайки — это хитрая жопа. Клиент может сам от себя охуеть, когда позже полезет в базу. Такое каскадное удаление нужно чётко и ясно прописывать в документации, иначе будет вам хиросима и нигерсраки в продакшене, когда что-то неожиданно исчезнет.