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

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

1.0 Junior🔥 201 комментариев
#API тестирование#Сети и протоколы

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

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

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

HTTP коды ответов сервера

Знание HTTP статус-кодов — одна из самых основных компетенций QA автоматизатора. Эти коды сообщают о результате обработки запроса и критичны для правильной валидации API.

Что такое HTTP статус-код

HTTP статус-код — это трёхзначное число в первой строке ответа сервера, которое указывает результат обработки запроса. Первая цифра определяет класс ответа.

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

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

  • 100 Continue — сервер готов получить тело запроса
  • 101 Switching Protocols — протокол переключается (например, WebSocket)
  • 102 Processing — обработка длительной операции

2xx — Успешные ответы (Success)

Индикируют успешное выполнение запроса.

200 OK — наиболее распространённый код успеха

  • Используется для успешных GET, PUT, PATCH
  • Содержит тело ответа с результатом
response = requests.get('/api/users/1')
assert response.status_code == 200
user = response.json()

201 Created — ресурс успешно создан

  • Используется для успешного POST
  • Обычно возвращает созданный объект
response = requests.post('/api/users', json={'name': 'John'})
assert response.status_code == 201
user_id = response.json()['id']

202 Accepted — запрос принят, но обработка ещё не завершена

  • Асинхронные операции
  • Фоновые задачи
response = requests.post('/api/reports/generate')
assert response.status_code == 202
job_id = response.json()['job_id']

204 No Content — успешный ответ без тела

  • Используется для DELETE
  • Используется для пустых успешных ответов
response = requests.delete('/api/users/1')
assert response.status_code == 204
assert response.text == ''

206 Partial Content — частичный контент

  • Используется при загрузке файлов по частям
  • Работа с Range headers

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

Указывают, что клиент должен выполнить дополнительное действие для завершения запроса.

300 Multiple Choices — несколько вариантов ответа

301 Moved Permanently — ресурс перемещён навсегда

  • URL изменился
  • Браузеры кэшируют редирект
response = requests.get('/api/old-endpoint', allow_redirects=False)
assert response.status_code == 301
assert response.headers['Location'] == '/api/new-endpoint'

302 Found — временное перенаправление

  • Ресурс временно доступен по другому URL
  • Браузеры не кэшируют

303 See Other — смотри другой ресурс

  • После POST перенаправляет на GET

304 Not Modified — ресурс не изменился

  • Используется с ETag и Last-Modified
  • Сэкономить полосу пропускания
response = requests.get('/api/data', headers={'If-None-Match': etag})
assert response.status_code == 304  # Данные не изменились

307 Temporary Redirect — временное перенаправление

  • Как 302, но сохраняет метод запроса

308 Permanent Redirect — постоянное перенаправление

  • Как 301, но сохраняет метод запроса

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

Указывают, что проблема на стороне клиента (в запросе).

400 Bad Request — неправильный формат запроса

  • Невалидный JSON
  • Отсутствуют обязательные параметры
  • Неправильный формат данных
response = requests.post('/api/users', json={'invalid': 'data'})
assert response.status_code == 400
errors = response.json()['errors']

401 Unauthorized — требуется аутентификация

  • Отсутствует или невалидный токен
  • Истекла сессия
response = requests.get('/api/protected')
assert response.status_code == 401

response = requests.get('/api/protected', headers={'Authorization': f'Bearer {token}'})
assert response.status_code == 200

403 Forbidden — доступ запрещён

  • Пользователь не имеет прав
  • Ресурс недоступен для этого пользователя
response = requests.delete('/api/users/123')  # Попытка удалить чужого пользователя
assert response.status_code == 403

404 Not Found — ресурс не найден

  • Несуществующий URL
  • Удалённый или переименованный ресурс
response = requests.get('/api/users/999999')
assert response.status_code == 404

405 Method Not Allowed — метод не разрешён

  • Попытка использовать неподдерживаемый метод
response = requests.put('/api/users')  # Endpoint не поддерживает PUT
assert response.status_code == 405

409 Conflict — конфликт

  • Дублирование уникальных данных
  • Одновременные изменения
response = requests.post('/api/users', json={'email': 'existing@example.com'})
assert response.status_code == 409  # Email уже существует

413 Payload Too Large — слишком большое тело запроса

  • Загружаемый файл слишком большой

429 Too Many Requests — слишком много запросов

  • Rate limiting (ограничение частоты запросов)
  • Клиент отправляет слишком быстро
response = requests.get('/api/data')
assert response.status_code == 429
retry_after = response.headers.get('Retry-After')  # Сколько секунд подождать

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

Указывают, что проблема на стороне сервера.

500 Internal Server Error — внутренняя ошибка сервера

  • Необработанное исключение
  • Ошибка в коде сервера
response = requests.get('/api/data')
assert response.status_code != 500, "Server error occurred"

501 Not Implemented — функционал не реализован

  • Endpoint существует, но ещё не реализован

502 Bad Gateway — плохой gateway

  • Ошибка на уровне reverse proxy
  • Upstream сервер недоступен

503 Service Unavailable — сервис недоступен

  • Сервер на обслуживании
  • Перегрузка сервера
response = requests.get('/api/data')
assert response.status_code != 503, "Service is down"

504 Gateway Timeout — timeout на gateway

  • Upstream сервер не ответил вовремя

Таблица коды ответов

КодНазваниеКогда использовать
200OKУспешный GET, PUT, PATCH
201CreatedУспешный POST (создание)
204No ContentУспешный DELETE
301Moved PermanentlyПостоянный редирект
400Bad RequestНевалидные данные
401UnauthorizedТребуется аутентификация
403ForbiddenНет прав доступа
404Not FoundРесурс не существует
429Too Many RequestsRate limit
500Internal Server ErrorОшибка на сервере
503Service UnavailableСервер недоступен

Практический пример комплексного теста

def test_api_status_codes():
    # 404 — ресурс не найден
    response = requests.get('/api/users/9999')
    assert response.status_code == 404
    
    # 400 — неправильные данные
    response = requests.post('/api/users', json={'invalid': 'data'})
    assert response.status_code == 400
    
    # 201 — успешное создание
    response = requests.post('/api/users', json={'name': 'John', 'email': 'john@example.com'})
    assert response.status_code == 201
    user_id = response.json()['id']
    
    # 200 — успешное получение
    response = requests.get(f'/api/users/{user_id}')
    assert response.status_code == 200
    
    # 200 — успешное обновление
    response = requests.put(f'/api/users/{user_id}', json={'name': 'Jane'})
    assert response.status_code == 200
    
    # 204 — успешное удаление
    response = requests.delete(f'/api/users/{user_id}')
    assert response.status_code == 204

Знание статус-кодов — основа для написания правильных и информативных тестов API.