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

Ответ

Коды состояния 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, правильной обработки ошибок на клиенте и проектирования надежных распределенных систем.

Ответ 18+ 🔞

А, слушай, вот эта вся хуйня с HTTP-статусами — это ж, блядь, как азбука Морзе для веба, только цифрами! Сервер тебе такими трёхзначными числами намекает, что у него там в душе творится после твоего запроса. Разберём, что к чему, а то потом будешь как дурак в логах сидеть и чесать репу.

1xx: Информационные (Informational) Ну, типа, «я тут, не сплю». Сервер говорит: «Чувак, я тебя услышал, продолжай, если что».

  • 100 Continue: Это когда ты такой: «Эй, сервак, я тебе щас огроменный JSON впендюрю, ты готов?». А он тебе: «Давай, хуле, шли уже, я пацан терпеливый». Используется с хедером Expect: 100-continue, если ты не в курсе.

2xx: Успех (Success) Вот это красота! Всё прошло, как по маслу. Сервер доволен, ты доволен.

  • 200 OK: Классика жанра. Запрос (GET, POST, PUT, DELETE) обработан, всё заебись. Данные — в теле ответа, забирай.
  • 201 Created: Ты там что-то создал (типа POST-запрос отправил), и сервер тебе такой: «Молодец, пацан, ресурс создал. Вот его новый адресок, держи» (часто в заголовке Location).
  • 204 No Content: Всё сделал, но тебе на руки нихуя не дам. Типичный ответ после успешного DELETE. «Удалил твою хуйню, иди нахуй».

3xx: Перенаправление (Redirection) А тут сервер начинает мудохаться: «Ищи то, не знаю что, но уже в другом месте».

  • 301 Moved Permanently: Ресурс переехал насовсем. Запомни новый адрес и больше не приставай со старым.
  • 302 Found / 307 Temporary Redirect: Ресурс временно тусуется в другом месте. 307 — чуть поумнее, он метод запроса (POST, например) не меняет, а 302 может и подменить.

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: Классика. «У меня внутри что-то пошло не так, но я тебе не скажу что именно. Иди нахуй». Общая ошибка, когда всё сломалось.
  • 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("Запрашиваемый ресурс не найден, ищи лучше.");
        }
        // А тут можно и на 429, и на 500 реакции прописать.
    }
}
catch (HttpRequestException ex)
{
    // Это если вообще соединиться не удалось, сеть сдохла и всё такое.
    Console.WriteLine($"Ошибка сетевого запроса: {ex.Message}");
}

Короче, если не понимаешь эти коды — пиши пропало. Отладка API превратится в ад, клиент будет падать в самых неожиданных местах, а распределённые системы будут рассыпаться как карточный домик. Так что вникай, это основа основ, ёпта!