Какие коды состояния HTTP вы знаете и для чего они используются?

«Какие коды состояния HTTP вы знаете и для чего они используются?» — вопрос из категории Сети, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Коды состояния HTTP (Status Codes) — трехзначные числа, которые сервер возвращает клиенту для информирования о результате обработки запроса. Они сгруппированы по первой цифре:

1xx: Информационные (Informational)

  • 100 Continue: Сервер готов принять тело запроса (используется с Expect: 100-continue).

2xx: Успех (Success)

  • 200 OK: Стандартный ответ для успешных GET, POST, PUT или DELETE запросов.
  • 201 Created: Запрос выполнен, новый ресурс создан (типичный ответ на успешный POST). В заголовке Location часто возвращается URI созданного ресурса.
  • 204 No Content: Сервер успешно обработал запрос, но не возвращает никакого контента в теле ответа (например, после успешного DELETE).

3xx: Перенаправление (Redirection)

  • 301 Moved Permanently: Ресурс навсегда перемещен на новый URI.
  • 302 Found / 307 Temporary Redirect: Ресурс временно доступен по другому URI. 307 сохраняет метод исходного запроса.

4xx: Ошибка клиента (Client Error)

  • 400 Bad Request: Сервер не может обработать запрос из-за некорректного синтаксиса (например, невалидный JSON).
  • 401 Unauthorized: Для доступа к ресурсу требуется аутентификация. Клиент должен предоставить корректные учетные данные.
  • 403 Forbidden: Сервер понял запрос, но отказывается его авторизовать. Проблема в правах, а не в аутентификации.
  • 404 Not Found: Сервер не может найти запрашиваемый ресурс.
  • 429 Too Many Requests: Клиент отправил слишком много запросов за короткое время (Rate Limiting).

5xx: Ошибка сервера (Server Error)

  • 500 Internal Server Error: Общая ошибка сервера, когда более конкретная 5xx ошибка не подходит.
  • 502 Bad Gateway: Сервер, выступая в роли шлюза или прокси, получил недопустимый ответ от вышестоящего сервера.
  • 503 Service Unavailable: Сервер временно не может обработать запрос (перегрузка, техобслуживание).

Пример обработки в C# с использованием HttpClient:

using var httpClient = new HttpClient();
try
{
    HttpResponseMessage response = await httpClient.GetAsync("https://api.example.com/data");

    // Проверяем, является ли ответ успешным (коды 2xx)
    if (response.IsSuccessStatusCode)
    {
        string responseBody = await response.Content.ReadAsStringAsync();
        Console.WriteLine($"Успех: {responseBody}");
    }
    else
    {
        // Обрабатываем ошибки клиента или сервера
        Console.WriteLine($"Ошибка: {(int)response.StatusCode} {response.ReasonPhrase}");
        if (response.StatusCode == HttpStatusCode.NotFound)
        {
            // Специфичная логика для 404
            Console.WriteLine("Запрашиваемый ресурс не найден.");
        }
    }
}
catch (HttpRequestException ex)
{
    Console.WriteLine($"Ошибка сетевого запроса: {ex.Message}");
}

Понимание этих кодов критично для отладки API, правильной обработки ошибок на клиенте и проектирования надежных распределенных систем.