Какие знаешь коды ответов сервера?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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 сервер не ответил вовремя
Таблица коды ответов
| Код | Название | Когда использовать |
|---|---|---|
| 200 | OK | Успешный GET, PUT, PATCH |
| 201 | Created | Успешный POST (создание) |
| 204 | No Content | Успешный DELETE |
| 301 | Moved Permanently | Постоянный редирект |
| 400 | Bad Request | Невалидные данные |
| 401 | Unauthorized | Требуется аутентификация |
| 403 | Forbidden | Нет прав доступа |
| 404 | Not Found | Ресурс не существует |
| 429 | Too Many Requests | Rate limit |
| 500 | Internal Server Error | Ошибка на сервере |
| 503 | Service 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.