Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
# HTTP статус-коды: Полный справочник
HTTP статус-коды — это одна из первых вещей, которую я проверяю при тестировании API. Это язык, на котором сервер говорит клиенту: успешно ли выполнен запрос, и если нет, почему.
Основные группы
Все HTTP статус-коды делятся на 5 групп:
2xx (Success) — Успех
200 OK — Самый распространённый код успеха. Используется для GET, POST, PUT, когда запрос выполнен и есть данные в ответе.
201 Created — Ресурс успешно создан (POST). Обычно возвращает Location header с URL нового ресурса.
204 No Content — Успешно, но нет данных в теле ответа. Используется для DELETE или когда ответ не требуется. ВАЖНО: body должно быть пустым!
3xx (Redirection) — Редирект
301 Moved Permanently — Ресурс перемещен постоянно. Браузер обновит bookmark.
304 Not Modified — Данные не изменились (кеширование). Client может использовать cached версию. Используется с ETag или If-Modified-Since.
4xx (Client Error) — Ошибка клиента
400 Bad Request — Неправильный формат запроса. Отсутствуют обязательные поля, некорректный JSON, неправильные параметры.
401 Unauthorized — Требуется авторизация. Нет или неправильный token. Response должен содержать WWW-Authenticate header.
403 Forbidden — Авторизован, но нет доступа. Недостаточно прав. Это более specific чем 404 для скрытия существования ресурса.
404 Not Found — Ресурс не существует. Это один из самых частых кодов при тестировании.
405 Method Not Allowed — Метод не поддерживается для этого ресурса. Должен содержать Allow header.
409 Conflict — Конфликт с текущим состоянием. Например: email уже существует, заказ уже отправлен, версия устарела.
429 Too Many Requests — Rate limiting. Слишком много запросов. Response должен содержать Retry-After header.
5xx (Server Error) — Ошибка сервера
500 Internal Server Error — Generic ошибка сервера. В production это баг!
502 Bad Gateway — Proxy получил неправильный ответ от upstream сервера. Обычно: database down, backend crash.
503 Service Unavailable — Сервер временно недоступен (maintenance, перегруз). Может содержать Retry-After header.
Правильное использование статус-кодов
Для POST (создание)
- 201 Created — успешное создание
- 400 Bad Request — invalid данные
- 409 Conflict — ресурс уже существует
Для PUT/PATCH (обновление)
- 200 OK — обновили, вернули данные
- 204 No Content — обновили, no body
- 400 Bad Request — invalid данные
- 404 Not Found — ресурс не найден
- 409 Conflict — конфликт (version mismatch)
Для DELETE
- 200 OK или 204 No Content — успешно удалили
- 404 Not Found — не существует
Для GET
- 200 OK — успешно
- 304 Not Modified — кешировано
- 404 Not Found — не найдено
Частые ошибки в API
Ошибка 1: Всегда возвращать 200, даже при errors. Нужно использовать proper status codes.
Ошибка 2: Путать 401 (Unauthorized — нужна авторизация) с 403 (Forbidden — нет доступа).
Ошибка 3: Возвращать 404 вместо 409 для конфликтов (duplicate email).
Ошибка 4: Отправлять body в 204 No Content ответах.
Ошибка 5: Возвращать 500 вместо более specific кодов (400, 409 и т.д.).
Как я тестирую статус-коды
Для каждого endpoint я пишу тесты:
import pytest
import requests
class TestAPI:
def test_get_existing_200(self):
response = requests.get("/users/1")
assert response.status_code == 200
def test_get_nonexistent_404(self):
response = requests.get("/users/99999")
assert response.status_code == 404
def test_create_201(self):
response = requests.post("/users", json={"name": "John", "email": "john@example.com"})
assert response.status_code == 201
assert "Location" in response.headers
def test_create_duplicate_409(self):
response = requests.post("/users", json={"name": "John", "email": "existing@example.com"})
assert response.status_code == 409
def test_invalid_input_400(self):
response = requests.post("/users", json={"name": "John"})
assert response.status_code == 400
def test_unauthorized_401(self):
response = requests.get("/me")
assert response.status_code == 401
def test_forbidden_403(self):
response = requests.delete("/users/other_user_id", headers={"Authorization": "Bearer token"})
assert response.status_code == 403
def test_delete_204(self):
response = requests.delete("/users/1")
assert response.status_code == 204
assert response.content == b"" # No body!
Выводы
Правильные HTTP статус-коды критичны для хорошего API. Они:
- Информируют client о результате запроса
- Упрощают debugging — по коду сразу понятна проблема
- Следуют стандартам — client может полагаться на consistent behaviour
- Улучшают UX — браузер и client-ы могут react properly (caching, retry, etc.)
При тестировании я ВСЕГДА проверяю правильность статус-кодов для каждого сценария. Неправильные коды — это признак низкого качества API.