Коды состояния HTTP

Материал из llmdocs — справочник разработчика
Коды состояния HTTP
Форматтрёхзначное число и поясняющая фраза
Классы1xx, 2xx, 3xx, 4xx, 5xx
СпецификацияRFC 9110 (2022)
РеестрIANA HTTP Status Code Registry
Самые известные200, 301, 404, 500

Коды состояния HTTP — трёхзначные числа в первой строке ответа HTTP-сервера, которые сообщают клиенту результат обработки запроса: успех, перенаправление, ошибка клиента или ошибка сервера. Рядом с кодом идёт короткая поясняющая фраза (reason phrase), например 404 Not Found, но программы ориентируются только на число. Коды определены в RFC 9110, а полный перечень ведёт IANA.[1][2]

Правильно выбранный код важен для API (REST), кэширования, поисковых систем и мониторинга: по доле ответов 5xx судят о здоровье сервиса.

Классы

Первая цифра задаёт класс ответа. Клиент, не знающий конкретного кода, обязан обработать его как код x00 своего класса — например, неизвестный 599 как 500.

Класс Значение
1xx информационный: запрос принят, обработка продолжается
2xx успех
3xx перенаправление: нужно дополнительное действие клиента
4xx ошибка клиента: запрос некорректен или не может быть выполнен
5xx ошибка сервера: запрос корректен, но сервер не справился

Основные коды

1xx и 2xx

Код Название Когда используется
101 Switching Protocols переход на другой протокол, например WebSocket
103 Early Hints ранние подсказки браузеру, какие ресурсы загружать
200 OK успешный запрос
201 Created ресурс создан; адрес — в заголовке Location
202 Accepted запрос принят в асинхронную обработку
204 No Content успех без тела ответа (часто на DELETE)
206 Partial Content отдана часть ресурса по заголовку Range (докачка, видео)

3xx

Код Название Когда используется
301 Moved Permanently ресурс переехал навсегда; поисковики переносят ссылочный вес
302 Found временное перенаправление
303 See Other после POST перейти на другой адрес методом GET
304 Not Modified кэшированная копия актуальна, тело не передаётся
307 Temporary Redirect временно, с сохранением метода и тела
308 Permanent Redirect навсегда, с сохранением метода и тела

Исторически браузеры при 301 и 302 меняли POST на GET; коды 307 и 308 введены, чтобы метод гарантированно сохранялся.

4xx

Код Название Когда используется
400 Bad Request синтаксически некорректный запрос
401 Unauthorized нужна аутентификация (на деле — «не аутентифицирован»)
403 Forbidden пользователь известен, но прав нет
404 Not Found ресурс не найден
405 Method Not Allowed метод не поддерживается для этого адреса
409 Conflict конфликт с текущим состоянием (дубликат, версия)
410 Gone ресурс удалён навсегда
413 Content Too Large слишком большое тело запроса
415 Unsupported Media Type неподдерживаемый Content-Type
422 Unprocessable Content синтаксис верен, но данные не проходят проверку
429 Too Many Requests превышен лимит частоты; когда повторить — в Retry-After[4]
451 Unavailable For Legal Reasons недоступно по юридическим причинам[5]

Код 451 — отсылка к роману Брэдбери «451 градус по Фаренгейту». Шуточный код 418 I'm a teapot («Я чайник») появился в первоапрельском RFC 2324 (1998) и стал частью веб-фольклора.

5xx

Код Название Когда используется
500 Internal Server Error необработанная ошибка в приложении
501 Not Implemented сервер не поддерживает функцию
502 Bad Gateway прокси получил некорректный ответ от бэкенда
503 Service Unavailable сервер перегружен или на обслуживании
504 Gateway Timeout прокси не дождался ответа бэкенда

Коды 502 и 504 обычно возвращает не само приложение, а обратный прокси вроде nginx: они означают, что бэкенд упал, недоступен или отвечает слишком долго.

Как выбирать код в API

  • 401 или 403? 401 — клиент не представился или токен недействителен; повторить с правильными учётными данными. 403 — клиент известен, но действие ему запрещено.
  • 400 или 422? 400 — запрос нельзя разобрать (сломанный JSON); 422 — разобрать можно, но значения неверны (email без @). Многие фреймворки, например FastAPI, возвращают 422 при ошибке проверки данных.
  • 404 вместо 403 иногда возвращают сознательно, чтобы не раскрывать само существование закрытого ресурса.
  • Не возвращайте 200 с ошибкой в теле ({"ok": false}): это ломает кэширование, мониторинг и повторы на стороне клиента.
  • Повторять запрос автоматически имеет смысл при 429, 502, 503 и 504 — с паузой и экспоненциальной задержкой, но не при 4xx, означающих ошибку в самом запросе.

Подробности ошибки в API принято передавать в стандартном формате Problem Details (RFC 9457) с типом содержимого application/problem+json:[6]

{
  "type": "https://example.com/errors/insufficient-funds",
  "title": "Недостаточно средств",
  "status": 409,
  "detail": "На счёте 30 ₽, требуется 50 ₽."
}

Проверка кода ответа

curl -s -o /dev/null -w '%{http_code}\n' https://example.com   # только код
curl -I https://example.com/old-page                           # заголовки, включая Location

Справочник с описанием каждого кода и примерами есть на MDN.[3] Утилита curl с флагом -f завершается ошибкой при кодах от 400, что удобно в скриптах.

См. также

Источники

  1. RFC 9110 — HTTP Semantics, Section 15: Status Codes
  2. IANA — HTTP Status Code Registry
  3. MDN — HTTP response status codes
  4. RFC 6585 — Additional HTTP Status Codes (428, 429, 431, 511)
  5. RFC 7725 — An HTTP Status Code to Report Legal Obstacles (451)
  6. RFC 9457 — Problem Details for HTTP APIs