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

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

Ответ

DELETE — это один из стандартных HTTP-методов (или "глаголов"), предназначенный для удаления указанного ресурса на сервере.

Ключевые характеристики:

  • Идемпотентность: Многократное выполнение одного и того же DELETE-запроса к одному ресурсу должно приводить к одному и тому же результату — ресурс удален. Второй и последующие запросы обычно возвращают 404 Not Found или 410 Gone.
  • Безопасность: НЕТ. DELETE изменяет состояние на сервере.
  • Ответ сервера: При успешном удалении сервер может вернуть:
    • 200 OK с телом ответа, содержащим статус операции.
    • 202 Accepted — запрос принят, но обработка еще не завершена.
    • 204 No Content (наиболее распространенный) — успешно обработан, тело ответа отсутствует.

Пример реализации DELETE-запроса в Swift с использованием URLSession:

func deleteResource(withId id: String, completion: @escaping (Result<Void, Error>) -> Void) {
    // 1. Формирование URL для конкретного ресурса.
    guard let url = URL(string: "https://api.example.com/posts/(id)") else {
        completion(.failure(URLError(.badURL)))
        return
    }

    // 2. Создание запроса с методом DELETE.
    var request = URLRequest(url: url)
    request.httpMethod = "DELETE"
    // При необходимости добавляем заголовки, например, для аутентификации.
    request.setValue("Bearer YOUR_TOKEN", forHTTPHeaderField: "Authorization")

    // 3. Создание и запуск data task.
    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        // 4. Обработка ошибки сети.
        if let error = error {
            DispatchQueue.main.async { completion(.failure(error)) }
            return
        }

        // 5. Проверка HTTP статус-кода.
        guard let httpResponse = response as? HTTPURLResponse else {
            DispatchQueue.main.async { completion(.failure(URLError(.cannotParseResponse))) }
            return
        }

        switch httpResponse.statusCode {
        case 200, 202, 204:
            // Успешное удаление.
            DispatchQueue.main.async { completion(.success(())) }
        case 404:
            DispatchQueue.main.async { completion(.failure(URLError(.resourceUnavailable))) }
        case 401, 403:
            DispatchQueue.main.async { completion(.failure(URLError(.userAuthenticationRequired))) }
        default:
            let error = URLError(.badServerResponse, userInfo: [NSLocalizedDescriptionKey: "Unexpected status code: (httpResponse.statusCode)"])
            DispatchQueue.main.async { completion(.failure(error)) }
        }
    }
    task.resume() // Запуск запроса.
}

// Использование функции.
deleteResource(withId: "123") { result in
    switch result {
    case .success:
        print("Ресурс успешно удален.")
        // Обновить UI (например, удалить строку из таблицы).
    case .failure(let error):
        print("Ошибка при удалении: (error.localizedDescription)")
        // Показать alert с ошибкой.
    }
}

Важно: Фактическое удаление данных (или их пометка как удаленные) полностью зависит от реализации серверного API. Клиент лишь отправляет запрос.