На какие классы (семейства) делятся HTTP-коды состояния?

Ответ

HTTP-коды состояния сгруппированы в пять классов, определяемых первой цифрой кода:

Класс Описание Примеры
1xx (Информационные) Сервер получил запрос и продолжает обработку. 100 Continue, 101 Switching Protocols
2xx (Успешные) Запрос был успешно получен, понят и обработан. 200 OK, 201 Created, 204 No Content
3xx (Перенаправления) Для завершения запроса требуется дополнительное действие (обычно — переход по другому URI). 301 Moved Permanently, 302 Found, 304 Not Modified
4xx (Ошибки клиента) Запрос содержит ошибку или не может быть выполнен сервером из-за действий клиента. 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found
5xx (Ошибки сервера) Сервер не смог выполнить заведомо корректный запрос. 500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable

Почему это важно для тестирования: Анализ кода ответа — первичный способ определения успешности или характера сбоя API-запроса.

Пример проверки в автотесте (Python + pytest):

import requests

def test_get_user_success():
    response = requests.get("https://api.example.com/users/1")
    # Проверяем, что запрос успешен (код 2xx)
    assert response.status_code == 200
    # Или проверяем конкретный код
    assert response.status_code == requests.codes.ok  # то же, что и 200

def test_get_user_not_found():
    response = requests.get("https://api.example.com/users/99999")
    # Проверяем, что ресурс не найден
    assert response.status_code == 404

Ответ 18+ 🔞

А, слушай, вот это тема, про которую каждый второй думает: "Да похуй, главное 200 или 404". А потом сидит и чешет репу, почему у него тесты ебутся, а в логах пиздец.

Короче, смотри. Все эти цифры, которые сервер тебе плюёт в ответ — они не просто так. Они разбиты на пять семейств, как по зоне. И каждая цифра в начале — это как нашивка, сразу понятно, с кем имеешь дело.

Класс Что означает, если по-русски Примеры, которые все видели
1xx (Информашка) Сервер такой: "Чувак, я твой запрос услышал, не перебивай, я думаю". Это как "минуточку" в техподдержке. 100 Continue (продолжай слать), 101 Switching Protocols (меняю протокол, не паникуй)
2xx (Успех, ёпта!) Всё прошло гладко, как по маслу. Запрос пришёл, был понят, и сервер сделал ровно то, что от него хотели. 200 OK (всё заебись, держи ответ), 201 Created (создал твою хуйню), 204 No Content (сделал, но хвастаться нечем)
3xx (Перенаправления) Сервер такой: "То, что тебе надо, теперь живёт вот там. Иди, не отвлекай меня". Клиент должен сделать ещё один запрос по новому адресу. 301 Moved Permanently (переехал навсегда, запомни новый адрес), 302 Found (временно тут, но ищи там), 304 Not Modified (ничего не поменялось, бери из кэша)
4xx (Ошибки клиента) Вот это, блядь, самое важное! Ошибка ТВОЯ. Ты накосячил: запрос кривой, без пароля, без прав или просто спросил какую-то дичь, которой нет. 400 Bad Request (ты мне какую-то хуйню прислал), 401 Unauthorized (а кто ты такой?), 403 Forbidden (ты кто такой, чтобы сюда лезть?), 404 Not Found (классика: тут нет того, что ты ищешь, иди нахуй)
5xx (Ошибки сервера) А вот это уже ЕГО проблемы. Запрос-то был нормальный, годный, но у сервака крыша поехала: код сломался, база легла, соседний сервис сдох. 500 Internal Server Error (у меня внутри всё горит, сам в шоке), 502 Bad Gateway (я спросил у соседа, а он мне какую-то дичь ответил), 503 Service Unavailable (я сейчас не могу, занят, заходи позже)

Нахуй это всё тестировщику? Да затем, что это первый и главный признак, жив запрос или нет. Не стал читать JSON, не стал парсить XML — сначала глянул статус. Не 2xx? Значит, пошло что-то не так. 4xx? Ищи косяк в своём запросе, мудак. 5xx? Беги к разработчикам и кричи, что их сервер — манда с ушами.

Как это в тестах выглядит, чтоб не быть распиздяем:

import requests

def test_get_user_success():
    response = requests.get("https://api.example.com/users/1")
    # Проверяем, что запрос успешен (код 2xx)
    assert response.status_code == 200
    # Или проверяем конкретный код
    assert response.status_code == requests.codes.ok  # то же, что и 200

def test_get_user_not_found():
    response = requests.get("https://api.example.com/users/99999")
    # Проверяем, что ресурс не найден
    assert response.status_code == 404

Вот и вся магия. Главное — не путать, когда ты сам идиот (4xx), а когда идиоты на той стороне (5xx). А то ведь бывает, начнёшь орать на бэкендера из-за своей же кривой JSON-ы, а потом охуеешь от стыда.