Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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—разработчика, позволяющее создавать понятные, надежные и соответствующие стандартам интерфейсы как для браузеров, так и для мобильных клиентов и других сервисов.