Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Коды состояния HTTP 4xx: Примеры и объяснения
Класс кодов состояния 4xx (Client Error) указывает, что ошибка произошла по вине клиента (например, браузера или приложения). Сервер получил корректный запрос, но не может его обработать из-за проблем на стороне клиента. Вот основные и наиболее часто встречающиеся примеры:
1. 400 Bad Request (Плохой запрос)
Сервер не может обработать запрос из-за синтаксической ошибки в запросе клиента (например, неверный формат JSON, отсутствующие обязательные параметры).
HTTP/1.1 400 Bad Request
Content-Type: application/json
{
"error": "Invalid JSON syntax in request body",
"details": "Expected ':' at line 3, column 15"
}
Типичные причины: Неправильный синтаксис запроса, несоответствие ожидаемому формату данных, нарушение схемы API.
2. 401 Unauthorized (Не авторизован)
Требуется аутентификация для доступа к ресурсу. Часто сопровождается заголовком WWW-Authenticate.
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="API", error="invalid_token"
Content-Type: application/json
{
"message": "Authentication failed: Invalid or expired token"
}
Важное различие: Этот код означает проблемы с аутентификацией (кто вы?), а не с правами доступа.
3. 403 Forbidden (Запрещено)
Сервер понял запрос, но отказывается его авторизовать. У клиента могут быть корректные учетные данные, но недостаточно прав.
# Пример в Python/Flask при проверке ролей
@app.route('/admin/dashboard')
def admin_dashboard():
if not current_user.has_role('admin'):
abort(403, description="Insufficient privileges to access admin dashboard")
return render_template('admin.html')
Типичные сценарии: Попытка доступа к чужому ресурсу, ограничения по IP-адресу, недостаточный уровень доступа в системе.
4. 404 Not Found (Не найдено)
Самый узнаваемый код - сервер не может найти запрашиваемый ресурс.
// Пример в Express.js
app.use((req, res, next) => {
res.status(404).json({
error: 'Resource not found',
path: req.originalUrl,
suggested_action: 'Check the API documentation at /docs'
});
});
Важно: 404 не указывает, является ли отсутствие ресурса временным или постоянным.
5. 405 Method Not Allowed (Метод не разрешен)
Метод запроса (GET, POST, PUT и т.д.) известен серверу, но не поддерживается для данного ресурса. Обязательно включает заголовок Allow со списком разрешенных методов.
HTTP/1.1 405 Method Not Allowed
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
{
"error": "DELETE method not allowed for this resource",
"allowed_methods": ["GET", "HEAD", "OPTIONS"]
}
6. 429 Too Many Requests (Слишком много запросов)
Клиент превысил лимит запросов (rate limiting). Часто включает заголовки с информацией о лимитах.
HTTP/1.1 429 Too Many Requests
Retry-After: 60
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1640995200
{
"error": "Rate limit exceeded",
"retry_after_seconds": 60,
"limit": "100 requests per hour"
}
Практическое значение для QA-инженера
Понимание кодов 4xx критически важно для тестирования, потому что:
- Диагностика проблем: Помогает быстро определить, где именно произошла ошибка - на стороне клиента или сервера
- Тест-кейсы: Позволяет создавать целенаправленные тесты для проверки обработки ошибок
- Валидация API: При тестировании REST API коды состояния являются частью контракта
- Пользовательский опыт: Корректная обработка этих ошибок на фронтенде напрямую влияет на UX
Пример теста для проверки 400 Bad Request:
import pytest
import requests
def test_invalid_json_returns_400():
"""Проверяем, что невалидный JSON вызывает 400 ошибку"""
url = "https://api.example.com/users"
headers = {"Content-Type": "application/json"}
invalid_json = '{"name": "John", "email": invalid-email}' # Невалидный JSON
response = requests.post(url, data=invalid_json, headers=headers)
assert response.status_code == 400, f"Expected 400, got {response.status_code}"
assert "error" in response.json(), "Error message should be in response"
Каждый код 4xx несет специфическую семантическую нагрузку, и корректное их использование в API значительно упрощает отладку и интеграцию между системами.