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

Приведи примеры кодов состояния 4xx

1.0 Junior🔥 191 комментариев
#Тестирование API

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

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

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

Коды состояния 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 значительно упрощает отладку и интеграцию между системами.