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

Какие знаешь HTTP статус-коды?

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

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

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

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

# 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. Они:

  1. Информируют client о результате запроса
  2. Упрощают debugging — по коду сразу понятна проблема
  3. Следуют стандартам — client может полагаться на consistent behaviour
  4. Улучшают UX — браузер и client-ы могут react properly (caching, retry, etc.)

При тестировании я ВСЕГДА проверяю правильность статус-кодов для каждого сценария. Неправильные коды — это признак низкого качества API.