> Какие HTTP статусы существуют и каково назначение 2xx, 3xx, 4xx, 5xx (Python)

Уровень: senior · Роль: backend · Язык: Python · Категория: Технические вопросы

Компании: GGSel, Фабрика решений

Стек: Python

> Пример ответа

Короткий ответ

HTTP-статусы - это трёхзначные коды ответа сервера, сгруппированные по классам: 2xx - успех, 3xx - перенаправление, 4xx - ошибка клиента, 5xx - ошибка сервера. Основные представители: 200 OK, 201 Created, 301 Moved Permanently, 304 Not Modified, 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 429 Too Many Requests, 500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable. Классы определяют семантику ответа и поведение клиента.

Подробное объяснение

2xx - успешное выполнение запроса. Ключевые коды:

  • 200 OK - стандартный ответ для GET, POST, PUT, DELETE
  • 201 Created - ресурс создан, в ответе обычно есть Location header
  • 202 Accepted - запрос принят, но обработка не завершена (асинхронные задачи)
  • 204 No Content - успех без тела ответа (например, DELETE)

3xx - перенаправление. Клиент должен выполнить дополнительное действие:

  • 301 Moved Permanently - ресурс переехал навсегда, клиент обновляет закладки
  • 302 Found - временное перенаправление (часто используется для редиректов после POST)
  • 304 Not Modified - используется с conditional requests (ETag, If-Modified-Since), тело не передаётся
  • 307 Temporary Redirect - сохраняет метод и тело запроса при редиректе
  • 308 Permanent Redirect - аналог 301, но сохраняет метод

4xx - ошибка на стороне клиента. Запрос сформирован некорректно или неавторизован:

  • 400 Bad Request - синтаксическая ошибка, невалидный JSON
  • 401 Unauthorized - отсутствует или невалидна аутентификация
  • 403 Forbidden - аутентификация есть, но недостаточно прав
  • 404 Not Found - ресурс не существует
  • 405 Method Not Allowed - метод не поддерживается для данного URL
  • 409 Conflict - конфликт с текущим состоянием ресурса (например, duplicate key)
  • 422 Unprocessable Entity - валидация данных провалена (часто в REST API)
  • 429 Too Many Requests - rate limiting

5xx - ошибка на стороне сервера. Сервер не смог обработать корректный запрос:

  • 500 Internal Server Error - необработанное исключение
  • 502 Bad Gateway - вышестоящий сервис вернул невалидный ответ
  • 503 Service Unavailable - сервис временно недоступен (maintenance, overload)
  • 504 Gateway Timeout - вышестоящий сервис не ответил вовремя

На практике

  • Для REST API важно различать 401 (нет аутентификации) и 403 (нет авторизации) - это разные сценарии обработки на клиенте.
  • 422 предпочтительнее 400 для ошибок валидации, так как 400 часто означает битую сериализацию.
  • При работе с идемпотентными операциями (PUT, DELETE) используйте 200 или 204, а не 201.
  • Для асинхронных задач используйте 202 + polling endpoint или webhook.
  • 304 - критичен для кэширования: правильно настроенные ETag/Last-Modified снижают нагрузку на сервер.
  • В микросервисной архитектуре 502/504 - сигнал для алертинга, а 503 - для автоматического масштабирования.

Пример кода

PYTHON
from fastapi import FastAPI, HTTPException, status
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
@app.post("/items", status_code=status.HTTP_201_CREATED)
async def create_item(item: Item):
# 201 Created с Location header
return {"id": 1, **item.dict()}
@app.get("/items/{item_id}")
async def get_item(item_id: int):
if item_id <= 0:
# 422 для ошибок валидации
raise HTTPException(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
detail="item_id must be positive"
)
# 404 для отсутствующего ресурса
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Item not found"
)
@app.delete("/items/{item_id}", status_code=status.HTTP_204_NO_CONTENT)
async def delete_item(item_id: int):
# 204 без тела ответа
return None
# Пример обработки 304 через ETag
from fastapi.responses import Response
@app.get("/cached-data")
async def cached_data(response: Response, if_none_match: str | None = None):
etag = '"abc123"'
if if_none_match == etag:
response.status_code = status.HTTP_304_NOT_MODIFIED
return Response(status_code=304)
response.headers["ETag"] = etag
return {"data": "fresh"}

Как отвечать на собеседовании

Начните с классификации по классам, затем перечислите основные коды с примерами использования. Подчеркните практические различия: 401 vs 403, 400 vs 422, 301 vs 308. Упомяните, как выбор статуса влияет на клиентское поведение (кэширование, retry, idempotency). Для senior-позиции добавьте рассуждение о дизайне API: когда использовать 202, как проектировать ошибки с machine-readable кодами в теле ответа, как 5xx влияет на SLO и алертинг.

Что проверяет интервьюер

  • Понимание семантики, а не заучивание кодов
  • Умение выбирать статус под конкретный сценарий
  • Знание edge cases: 204 vs 200, 301 vs 308, 401 vs 403
  • Понимание связи статусов с кэшированием, retry-логикой, rate limiting
  • Способность объяснить, как 5xx обрабатываются в распределённых системах (circuit breaker, retry with backoff)

Типичные ошибки

  • Путаница между 401 и 403: 401 - нет аутентификации, 403 - нет авторизации
  • Использование 400 для всех ошибок клиента вместо 422 для валидации
  • Возврат 200 для ошибок бизнес-логики (например, {"error": "insufficient funds"}) - это антипаттерн
  • Неправильный выбор между 301 и 308: 301 меняет метод на GET, 308 сохраняет
  • Игнорирование 429 и отсутствие Retry-After header
  • Возврат 500 для ожидаемых ошибок (например, duplicate key) - нужно 409
  • Забывают про 304 при реализации кэширования - это ведёт к лишней передаче данных

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью