← Назад к вопросам

Какие HTTP-коды ответов вы знаете? Что означают коды 200, 201, 400, 401, 403, 404, 500?

2.0 Middle🔥 241 комментариев
#API и интеграции

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

HTTP коды ответов и их значения

HTTP статус коды — это трехзначные числа, которые сервер отправляет клиенту в ответ на HTTP запрос. Они сообщают о результате попытки выполнить запрос: успех, ошибка клиента, ошибка сервера и так далее.

Классификация HTTP кодов

Все статус коды разделены на 5 категорий в зависимости от первой цифры:

1xx (100-199) — Informational (Информационные)

  • Промежуточные ответы
  • Запрос получен и обрабатывается

2xx (200-299) — Success (Успешно)

  • Запрос успешно выполнен
  • Клиент получил желаемый результат

3xx (300-399) — Redirection (Перенаправление)

  • Требуется дополнительное действие для выполнения запроса
  • Обычно редирект на другой URL

4xx (400-499) — Client Error (Ошибка клиента)

  • Запрос содержит ошибку
  • Клиент виноват в проблеме

5xx (500-599) — Server Error (Ошибка сервера)

  • Сервер не может выполнить корректный запрос
  • Сервер виноват в проблеме

Детальный разбор основных кодов

2xx — Успешные коды

200 OK

Значение: Запрос выполнен успешно, ответ содержит желаемые данные

Когда использовать:

  • GET запрос успешно выполнен
  • PUT запрос успешно обновил ресурс
  • DELETE запрос успешно удалил ресурс (иногда)
  • Любой успешный запрос

Пример:

Запрос: GET /api/users/123
Ответ: 200 OK
Тело: {
  "id": 123,
  "name": "John",
  "email": "john@example.com"
}

201 Created

Значение: Ресурс успешно создан, новый ресурс находится в теле ответа или в заголовке Location

Когда использовать:

  • POST запрос создал новый ресурс
  • Необходимо вернуть в Location адрес нового ресурса

Пример:

Запрос: POST /api/users
Тело: {"name": "Alice", "email": "alice@example.com"}

Ответ: 201 Created
Location: /api/users/124
Тело: {
  "id": 124,
  "name": "Alice",
  "email": "alice@example.com",
  "created_at": "2024-03-29T10:00:00Z"
}

202 Accepted

Значение: Запрос принят, но обработка еще не завершена (асинхронная обработка)

Когда использовать:

  • Длительная операция (отправка email, обработка видео)
  • Задача добавлена в очередь
  • Результат будет доступен позже

Пример:

Запрос: POST /api/videos/upload
Ответ: 202 Accepted
Тело: {
  "job_id": "abc123",
  "status": "processing",
  "check_status_url": "/api/jobs/abc123"
}

204 No Content

Значение: Запрос успешно выполнен, но нет содержимого в ответе

Когда использовать:

  • DELETE запрос успешно удалил ресурс
  • PUT запрос без возврата обновленного ресурса
  • Запрос выполнен, но ничего возвращать не нужно

Пример:

Запрос: DELETE /api/users/123
Ответ: 204 No Content
Тело: (пусто)

3xx — Коды перенаправления

301 Moved Permanently

Значение: Ресурс переместился навсегда на новый адрес

Когда использовать:

  • URL сайта изменился и больше не вернется
  • Поисковики обновят закладку

Пример:

Запрос: GET /old-product-page
Ответ: 301 Moved Permanently
Location: /products/item-123

302 Found (или 303 See Other)

Значение: Ресурс временно доступен по другому адресу

Когда использовать:

  • Временное перенаправление
  • После POST обычно перенаправляют на результат (POST-Redirect-GET паттерн)

Пример:

Запрос: POST /api/login
Ответ: 302 Found
Location: /dashboard

304 Not Modified

Значение: Ресурс не изменился с момента последнего запроса

Когда использовать:

  • Кэширование
  • Если клиент отправил If-None-Match и ETag совпадает
  • Экономия пропускной способности

Пример:

Запрос 1: GET /api/data
Ответ 1: 200 OK, ETag: "abc123"

Запрос 2: GET /api/data
Заголовок: If-None-Match: "abc123"
Ответ 2: 304 Not Modified
(тело пусто, клиент использует кэшированные данные)

4xx — Ошибки клиента

400 Bad Request

Значение: Запрос содержит синтаксическую ошибку или неправильный формат

Когда использовать:

  • Невалидный JSON в теле
  • Отсутствуют обязательные параметры
  • Неправильный формат параметров
  • Нарушены правила валидации

Пример:

Запрос: POST /api/users
Тело: {"name": "John"}  // email обязателен

Ответ: 400 Bad Request
Тело: {
  "error": "Validation failed",
  "details": {"email": "Email is required"}
}

401 Unauthorized

Значение: Требуется аутентификация, либо аутентификация неправильная

Когда использовать:

  • Отсутствует Authorization заголовок
  • Токен истек
  • Неправильный пароль
  • Неподдерживаемый механизм аутентификации

Пример:

Запрос: GET /api/profile (без токена)
Ответ: 401 Unauthorized
Заголовок: WWW-Authenticate: Bearer realm="api"
Тело: {"error": "Token required"}

403 Forbidden

Значение: Аутентификация прошла, но пользователь не имеет прав доступа к ресурсу

Когда использовать:

  • Пользователь авторизован, но не может удалить другого пользователя
  • Доступ запрещен ролевой политикой
  • Ограничение по IP
  • Требуется премиум подписка

Различие 401 и 403:

401: "Кто ты? Пожалуйста, авторизуйся"
403: "Я знаю кто ты, но ты не имеешь права это делать"

Пример:
401: GET /api/profile (без токена)
403: GET /api/admin/users (пользователь не admin)

Пример:

Запрос: DELETE /api/users/456 (от пользователя 123)
Ответ: 403 Forbidden
Тело: {
  "error": "You can only delete your own account",
  "required_role": "admin"
}

404 Not Found

Значение: Запрашиваемый ресурс не существует на сервере

Когда использовать:

  • Запрошен несуществующий пользователь
  • Запрошен несуществующий endpoint
  • URL опечатка
  • Ресурс был удален

Пример:

Запрос: GET /api/users/99999 (этого пользователя нет)
Ответ: 404 Not Found
Тело: {
  "error": "User not found",
  "user_id": 99999
}

409 Conflict

Значение: Запрос конфликтует с текущим состоянием ресурса

Когда использовать:

  • Попытка создать ресурс, который уже существует
  • Версия ресурса изменилась (concurrent update)
  • Конфликт в бизнес-логике

Пример:

Запрос: POST /api/users
Тело: {"email": "john@example.com"}  // этот email уже существует
Ответ: 409 Conflict
Тело: {"error": "User with this email already exists"}

429 Too Many Requests

Значение: Клиент отправляет слишком много запросов в единицу времени

Когда использовать:

  • Rate limiting
  • Защита от брутфорса
  • Защита от DDoS

Пример:

Запрос 101: GET /api/data (превышен лимит 100 запросов/мин)
Ответ: 429 Too Many Requests
Заголовки:
  Retry-After: 60
  X-RateLimit-Limit: 100
  X-RateLimit-Remaining: 0
Тело: {"error": "Rate limit exceeded. Try again in 60 seconds"}

5xx — Ошибки сервера

500 Internal Server Error

Значение: Сервер встретил непредвиденную ошибку, которую не может обработать

Когда использовать:

  • Необработанное исключение
  • Ошибка в коде сервера
  • Проблема с БД
  • Неожиданное состояние

Пример:

Запрос: GET /api/users/123
Сервер: Division by zero error
Ответ: 500 Internal Server Error
Тело: {
  "error": "Internal server error",
  "request_id": "req-12345"
}

502 Bad Gateway

Значение: API Gateway или proxy получил невалидный ответ от upstream сервера

Когда использовать:

  • API Gateway не может связаться с бэкенд-сервисом
  • Бэкенд-сервис упал
  • Неправильная конфигурация proxy

Пример:

Архитектура: Клиент → API Gateway → UserService

У случилось crash UserService
Ответ: 502 Bad Gateway
Тело: {"error": "Service unavailable"}

503 Service Unavailable

Значение: Сервер временно недоступен (maintenance, overload)

Когда использовать:

  • Плановое обслуживание
  • Сервер перегружен
  • Хранилище данных недоступно
  • Временная проблема

Пример:

Запрос: GET /api/data (во время обновления БД)
Ответ: 503 Service Unavailable
Заголовок: Retry-After: 3600  (попробуйте через час)
Тело: {"error": "System is under maintenance"}

504 Gateway Timeout

Значение: Gateway не получил ответ от upstream сервера в определенное время

Когда использовать:

  • Upstream сервер слишком медленный
  • Timeout в сетевом подключении
  • Бесконечный цикл на сервере

Таблица основных кодов

КодИмяЗначение
200OKВсе хорошо
201CreatedРесурс создан
204No ContentУспешно, но нет содержимого
301Moved PermanentlyПостоянный редирект
302FoundВременный редирект
304Not ModifiedКэшированные данные
400Bad RequestОшибка в запросе
401UnauthorizedТребуется аутентификация
403ForbiddenНедостаточно прав
404Not FoundРесурс не найден
409ConflictКонфликт состояния
429Too Many RequestsСлишком много запросов
500Internal Server ErrorОшибка сервера
502Bad GatewayUpstream недоступен
503Service UnavailableСервис недоступен
504Gateway TimeoutTimeout

Правильное использование HTTP кодов

Best Practices:

  1. Используй правильный код для ситуации

    • Неправильно: DELETE успешный → 200 OK
    • Правильно: DELETE успешный → 204 No Content
  2. Включай информацию об ошибке в тело

    Хорошо:
    400 Bad Request
    {"error": "Email is required", "field": "email"}
    
    Плохо:
    400 Bad Request
    (просто пусто)
    
  3. Используй Location заголовок для 201 и редиректов

    201 Created
    Location: /api/users/123
    
  4. Не используй 200 для ошибок

    Неправильно:
    200 OK
    {"error": "Invalid request"}
    
    Правильно:
    400 Bad Request
    {"error": "Invalid request"}
    
  5. Используй 204 когда нечего возвращать

    DELETE /api/users/123
    204 No Content
    (никакого тела)
    

Обработка HTTP кодов на клиенте

JavaScript пример:

fetch('/api/users/123')
  .then(response => {
    if (response.ok) {  // 200-299
      return response.json();
    } else if (response.status === 401) {
      // Требуется аутентификация
      redirect_to_login();
    } else if (response.status === 404) {
      // Ресурс не найден
      show_not_found_page();
    } else if (response.status >= 500) {
      // Ошибка сервера
      show_error_message();
    }
  })

Понимание HTTP кодов критично для правильной разработки API. Они позволяют клиентам и серверам эффективно коммуницировать о результате запроса.