Что такое HTTP-метод DELETE?

Ответ

DELETE — это идемпотентный HTTP-метод, предназначенный для удаления указанного ресурса на сервере. Идемпотентность означает, что несколько идентичных запросов должны приводить к одному и тому же результату (после первого удаления ресурса последующие запросы вернут 404 Not Found).

Семантика и коды состояния

  • 204 No Content: Успешное удаление. Тело ответа обычно отсутствует.
  • 200 OK: Успешное удаление, сервер может вернуть информацию об удаленном ресурсе в теле.
  • 202 Accepted: Запрос принят на обработку, но она еще не завершена.
  • 404 Not Found: Удаляемый ресурс не найден.
  • 403 Forbidden / 401 Unauthorized: Недостаточно прав для выполнения операции.

Пример реализации

Клиент на C# (HttpClient):

public async Task<bool> DeleteUserAsync(int userId)
{
    using var httpClient = new HttpClient();
    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _token);

    var response = await httpClient.DeleteAsync($"https://api.example.com/users/{userId}");

    if (response.StatusCode == HttpStatusCode.NoContent)
    {
        Console.WriteLine($"User {userId} deleted successfully.");
        return true;
    }
    // Обработка ошибок (404, 403 и т.д.)
    return false;
}

Сервер на ASP.NET Core (Minimal API):

app.MapDelete("/users/{id:int}", async (int id, AppDbContext dbContext) =>
{
    var user = await dbContext.Users.FindAsync(id);
    if (user is null) return Results.NotFound();

    dbContext.Users.Remove(user);
    await dbContext.SaveChangesAsync();

    return Results.NoContent(); // Статус 204
});

Важные аспекты безопасности

  • Всегда проверяйте авторизацию. DELETE-запросы должны быть доступны только аутентифицированным и авторизованным пользователям.
  • Реализуйте мягкое удаление (soft delete) через флаг IsDeleted, если данные могут потребоваться для аудита или восстановления.
  • Избегайте уязвимостей, таких как массовое удаление (например, DELETE /users без ID). Операции удаления должны быть точечными.

Ответ 18+ 🔞

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

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

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

  • 204 No Content (Нет содержимого): Всё, готово, удалил. Тела ответа обычно нет — что тут обсуждать, сделал и всё. Идеальный вариант.
  • 200 OK: Тоже удалил, но, видимо, такой щедрый, что прислал тебе прощальное письмо от удалённого ресурса в теле ответа. Бывает.
  • 202 Accepted (Принято): «Ладно, принял заявку на удаление, но оно у меня в очереди, подожди чутка». Асинхронная обработка, короче.
  • 404 Not Found (Не найдено): А удалять-то нечего, чувак! Либо уже удалили, либо ID кривой.
  • 403 Forbidden / 401 Unauthorized: А тебе кто разрешил? Нет прав — иди нахуй со своим удалением.

Вот тебе пример, как это может выглядеть в коде.

Клиентская сторона на C# (HttpClient). Представь, что мы удаляем пользователя:

public async Task<bool> DeleteUserAsync(int userId)
{
    using var httpClient = new HttpClient();
    // Не забудь авторизацию, а то тебя пошлют
    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _token);

    var response = await httpClient.DeleteAsync($"https://api.example.com/users/{userId}");

    if (response.StatusCode == HttpStatusCode.NoContent)
    {
        Console.WriteLine($"Пользователя с ID {userId} отправили в небытие.");
        return true;
    }
    // А тут обрабатывай ошибки — 404, 403 и прочую хуйню
    return false;
}

А вот как это может быть на сервере (ASP.NET Core Minimal API):

app.MapDelete("/users/{id:int}", async (int id, AppDbContext dbContext) =>
{
    // Сначала ищем, а есть ли такой страдалец
    var user = await dbContext.Users.FindAsync(id);
    if (user is null) return Results.NotFound(); // 404 — не нашли, идиот

    // Нашли — значит, можно к хуям
    dbContext.Users.Remove(user);
    await dbContext.SaveChangesAsync();

    return Results.NoContent(); // Всё, нет его, 204
});

И напоследок, серьёзные вещи про безопасность, а то накосячите:

  1. Права, блядь, проверяй! DELETE не должен быть доступен всяким левым личностям. Только тем, кому действительно можно. Иначе будет вам цифровой погром.
  2. Жёсткое удаление (hard delete) — это навсегда. Часто умнее делать мягкое удаление (soft delete): просто ставишь флажок IsDeleted в базе. Ресурс как бы «невидим» для системы, но в случае чего — для аудита или если начальник обосрался — можно восстановить. Страховка, понимаешь?
  3. Не делай дыр для массового удаления! Никаких DELETE /users без указания конкретного ID. Это же пиздец будет, если кто-то или что-то такой запрос случайно пошлёт. Только точечные удаления: /users/123. Иначе одним запросом всю базу в тартары.