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

Какие знаешь статусы ответа?

1.3 Junior🔥 161 комментариев
#API и веб-протоколы

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

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

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

HTTP статусы ответа и их применение в PHP Backend

Как Backend—разработчик, я ежедневно работаю с HTTP статус—кодами — это трёхзначные коды, которые сервер возвращает клиенту для индикации результата обработки запроса. Они разделены на 5 классов, определяемых первой цифрой. В PHP мы работаем с ними через header() функцию или фреймворки.

Основные классы статус—кодов

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

Редко используются в обычном веб—разработке. Указывают, что запрос принят и обработка продолжается.

  • 100 Continue — клиент может продолжать отправлять тело запроса.
  • 101 Switching Protocols — сервер соглашается сменить протокол (например, на WebSocket).

2xx: Успех (Success)

Наиболее желаемые коды. Говорят об успешном выполнении запроса.

// Пример установки статуса 200 в чистом PHP
header("HTTP/1.1 200 OK");
// Или через функцию
http_response_code(200);

// В Laravel (и подобных фреймворках) это делается иначе
return response()->json(['data' => $users], 200); // 200 OK
// Или просто возвращаем данные, фреймворк сам поставит 200
return response($content);

Ключевые статусы 2xx:

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

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

Указывают клиенту на необходимость дополнительных действий для завершения запроса.

// Реддирект в чистом PHP
header("Location: /new-page", true, 301); // 301 Moved Permanently

// В Laravel
return redirect('/home'); // По умолчанию 302
return redirect()->route('profile')->with('status', 301);

Важные статусы 3xx:

  • 301 Moved Permanently — ресурс навсегда перемещён на новый URI. Поисковые системы обновляют индекс.
  • 302 Found (ранее Moved Temporarily) — ресурс временно доступен по другому URI. Браузеры используют GET для нового запроса.
  • 303 See Other — результат запроса (например, POST) находится по другому URI, который нужно запросить GET'ом.
  • 304 Not ModifiedКритически важен для кэширования. Сервер возвращает его, если ресурс не изменился (на основе заголовков If-Modified-Since или ETag). Клиент использует кэшированную версию.

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

Ошибка на стороне клиента (неправильный запрос, отсутствие прав, не найден ресурс).

// В контроллере Laravel часто используются помощники или исключения
abort(404); // Генерирует ответ с 404 Not Found
abort(403, 'Unauthorized action.'); // 403 Forbidden

// Или через ответ
return response()->json(['error' => 'Not Found'], 404);

// Для аутентификации
return response()->json(['message' => 'Authentication required'], 401);

Основные статусы 4xx:

  • 400 Bad Request — общая ошибка, сервер не может обработать запрос из—за некорректного синтаксиса (например, невалидный JSON в теле).
  • 401 Unauthorized — запрос требует аутентификации (клиент не представил учётные данные).
  • 403 Forbidden — сервер понял запрос, но отказывается его авторизовать (у клиента нет прав на действие).
  • 404 Not Found — самый известный статус. Ресурс по указанному URI не найден.
  • 405 Method Not Allowed — метод (GET, POST и т.д.) не поддерживается для данного URI (должен возвращать заголовок Allow).
  • 422 Unprocessable Entity (WebDAV) — Широко используется в REST API для ошибок валидации. Запрос синтаксически корректен, но семантически ошибочен (не проходят бизнес—правила).

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

Ошибка на стороне сервера. Возвращая такие коды, мы признаём, что проблема не в запросе клиента.

// В случае непредвиденной ошибки в Laravel
try {
    // ... рискованный код ...
} catch (\Exception $e) {
    Log::error($e->getMessage());
    // Возвращаем 500, но без деталей в продакшене
    return response()->json(['message' => 'Internal server error'], 500);
}

// Специфическая ошибка сервиса
if (!$externalService->isAvailable()) {
    abort(503); // 503 Service Unavailable
}

Ключевые статусы 5xx:

  • 500 Internal Server Error — общая ошибка сервера, когда нет более подходящего статуса (непойманное исключение, конфигурационная ошибка).
  • 502 Bad Gateway — сервер, выступая в роли шлюза или прокси, получил недействительный ответ от вышестоящего сервера.
  • 503 Service Unavailable — сервер временно не может обработать запрос из—за перегрузки или технического обслуживания. Должен возвращать заголовок Retry-After.
  • 504 Gateway Timeout — сервер, выступая в роли шлюза или прокси, не дождался ответа от вышестоящего сервера.

Практические принципы использования в Backend

  • Точность — вежливость королей: Всегда выбирайте максимально точный статус. Не возвращайте 500, если это 400 или 422.
  • RESTful API: Статусы — неотъемлемая часть контракта API. 201 для создания, 204 для удаления, 400/422 для валидации.
  • Безопасность: Не раскрывайте в телах ответов к 5xx ошибкам детали (стек—трейсы, пути к файлам) в продакшене.
  • Кэширование: Правильное использование 304, 200 (с Cache-Control) критично для производительности.
  • Логирование: 4xx ошибки часто логируются на уровне WARNING, 5xx — на уровне ERROR, так как указывают на наши проблемы.

Понимание и грамотное применение HTTP статусов — это признак зрелости backend—разработчика, позволяющее создавать понятные, надежные и соответствующие стандартам интерфейсы как для браузеров, так и для мобильных клиентов и других сервисов.