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

«Что такое HTTP-метод DELETE?» — вопрос из категории HTTP и веб-протоколы, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

DELETE — это идемпотентный HTTP-метод, предназначенный для удаления ресурса, идентифицированного данным URI (Uniform Resource Identifier).

Ключевые характеристики с точки зрения тестирования API:

  • Идемпотентность: Многократный вызов DELETE для одного и того же ресурса должен приводить к одному и тому же результату (ресурс удален). После первого успешного удаления последующие запросы обычно возвращают 404 Not Found или 410 Gone.
  • Коды ответов:
    • 200 OK — Удаление прошло успешно, в теле ответа может быть информация об удаленном ресурсе.
    • 204 No Content — Успешное удаление, тело ответа отсутствует (наиболее распространенный сценарий).
    • 202 Accepted — Запрос на удаление принят, но еще не обработан (асинхронная операция).
    • 404 Not Found — Ресурс не найден (или уже был удален).
    • 403 Forbidden / 401 Unauthorized — Нет прав на выполнение операции.
  • Безопасность: DELETE не является безопасным (safe) методом, так как изменяет состояние на сервере.

Тест-кейсы для QA-инженера:

  1. Успешное удаление: Отправить DELETE-запрос на существующий ресурс, проверить код ответа 204 и что ресурс действительно недоступен через последующий GET.
  2. Удаление несуществующего ресурса: Ожидается 404.
  3. Повторное удаление (идемпотентность): Второй запрос должен также вернуть 404.
  4. Удаление без авторизации: Ожидается 401/403.
  5. Валидация каскадного удаления: Если удаление родительского ресурса (например, пользователя) должно каскадно удалять дочерние (его заказы), это нужно проверить.
  6. «Мягкое» удаление: Проверить, что вместо физического удаления данные могли быть помечены флагом is_deleted = true, и это корректно обрабатывается другими endpoint'ами.

Пример теста на Python с использованием requests:

import requests

BASE_URL = "https://api.example.com/v1"
USER_ID = 123

# 1. Успешное удаление
response = requests.delete(f"{BASE_URL}/users/{USER_ID}", headers={"Authorization": "Bearer <token>"})
assert response.status_code == 204, f"Expected 204, got {response.status_code}"

# 2. Проверка, что ресурс удален
get_response = requests.get(f"{BASE_URL}/users/{USER_ID}")
assert get_response.status_code == 404, "Resource should no longer exist"