Полное руководство по HTTP кодам состояния
Изучите HTTP коды состояния с нашим подробным руководством. Узнайте о всех кодах групп 1xx, 2xx, 3xx, 4xx и 5xx с практическими примерами и лучшими практиками для веб-разработчиков.
Введение в HTTP коды состояния
HTTP коды состояния — это трёхзначные числа, которые веб-серверы отправляют браузерам для указания результата обработки запроса клиента. Понимание этих кодов критически важно для веб-разработчиков, системных администраторов и всех, кто работает с веб-приложениями.
Понимание структуры
HTTP коды состояния организованы в пять классов на основе первой цифры:
- 1xx (Информационные): Запрос получен, продолжается обработка
- 2xx (Успешные): Запрос был успешно получен, понят и принят
- 3xx (Перенаправление): Требуются дополнительные действия для завершения запроса
- 4xx (Ошибка клиента): Запрос содержит плохой синтаксис или не может быть выполнен
- 5xx (Ошибка сервера): Сервер не смог выполнить явно правильный запрос
1xx Информационные ответы
100 Continue
Сервер получил заголовки запроса и клиент должен продолжить отправку тела запроса.
// Пример: загрузка большого файла с заголовком Expect
curl -X POST -H "Expect: 100-continue" -d @largefile.json https://api.example.com/upload
101 Switching Protocols
Сервер переключает протоколы согласно заголовку Upgrade.
2xx Успешные ответы
200 OK
Запрос выполнен успешно. Значение зависит от используемого HTTP метода.
// Пример на PHP
if ($user->save()) {
http_response_code(200);
echo json_encode(['status' => 'success', 'user' => $user]);
}
201 Created
Запрос выполнен и в результате создан новый ресурс.
// Пример на JavaScript/Node.js
app.post('/users', (req, res) => {
const user = new User(req.body);
user.save()
.then(() => res.status(201).json(user))
.catch(err => res.status(400).json({error: err.message}));
});
204 No Content
Сервер успешно обработал запрос, но не возвращает никакого содержимого.
3xx Перенаправление
301 Moved Permanently
Ресурс был постоянно перемещён на новый URL.
# Пример для Apache .htaccess
Redirect 301 /old-page.html /new-page.html
302 Found (Временное перенаправление)
Ресурс временно находится по другому URL.
304 Not Modified
Ресурс не был изменён с версии, указанной в заголовках запроса.
4xx Ошибки клиента
400 Bad Request
Сервер не может обработать запрос из-за ошибки клиента (неправильный синтаксис, некорректное сообщение запроса и т.д.).
// Пример на Python Flask
@app.route('/api/users', methods=['POST'])
def create_user():
if not request.json or 'email' not in request.json:
return jsonify({'error': 'Email обязателен'}), 400
401 Unauthorized
Требуется аутентификация, которая не удалась или не была предоставлена.
// Пример middleware на Express.js
function requireAuth(req, res, next) {
const token = req.headers.authorization;
if (!token) {
return res.status(401).json({error: 'Требуется авторизация'});
}
// Логика проверки токена здесь
next();
}
403 Forbidden
У клиента нет прав доступа к содержимому.
404 Not Found
Сервер не может найти запрашиваемый ресурс.
// Пример на Laravel
Route::fallback(function () {
return response()->json(['error' => 'Маршрут не найден'], 404);
});
5xx Ошибки сервера
500 Internal Server Error
Общее сообщение об ошибке, когда сервер встречает неожиданное условие.
// Пример обработки ошибок
try {
// Операция, которая может завершиться неудачей
$result = processComplexOperation();
} catch (Exception $e) {
error_log("Ошибка сервера: " . $e->getMessage());
http_response_code(500);
echo json_encode(['error' => 'Внутренняя ошибка сервера']);
}
502 Bad Gateway
Сервер, действуя как шлюз или прокси, получил недействительный ответ от upstream сервера.
503 Service Unavailable
Сервер в настоящее время недоступен (перегружен или на техническом обслуживании).
Лучшие практики для разработчиков
Согласованность API ответов
Всегда используйте подходящие коды состояния с согласованными форматами ответов:
// Хорошая практика - согласованный формат ошибок
{
"error": {
"code": 400,
"message": "Ошибка валидации",
"details": {
"email": ["Email обязателен"],
"password": ["Пароль должен быть минимум 8 символов"]
}
}
}
Обработка ошибок на фронтенде
// JavaScript fetch с правильной обработкой ошибок
async function apiCall(url, options) {
try {
const response = await fetch(url, options);
if (!response.ok) {
if (response.status === 401) {
// Перенаправление на страницу входа
window.location.href = '/login';
return;
}
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
}
return await response.json();
} catch (error) {
console.error('API вызов неудачен:', error);
throw error;
}
}
Тестирование HTTP кодов состояния
Используйте инструменты как curl, Postman, или пишите автоматизированные тесты для проверки правильности возвращаемых кодов состояния:
# Тестирование с помощью curl
curl -I -X GET https://api.example.com/users/123
# Ожидаемые заголовки ответа
HTTP/2 200
content-type: application/json
cache-control: max-age=300
Распространённые ошибки, которых следует избегать
- Возврат 200 OK для ошибок в теле ответа
- Использование 404 для неавторизованного доступа (используйте 401 или 403 вместо этого)
- Неимплементация правильного кеширования с 304 Not Modified
- Игнорирование 5xx ошибок в мониторинге продакшн среды
Мониторинг и логирование
Настройте правильный мониторинг для отслеживания паттернов кодов состояния:
// Пример настройки мониторинга
if (response.status >= 500) {
logger.error("Ошибка сервера", {
url: request.url,
method: request.method,
status: response.status,
user_id: user?.id
});
}
Понимание и правильная реализация HTTP кодов состояния необходимы для создания надёжных, поддерживаемых веб-приложений. Они предоставляют ценную информацию для отладки, мониторинга и создания лучшего пользовательского опыта.