На какие группы делятся HTTP коды состояния?

Ответ

Коды состояния HTTP (Status Codes) стандартизированы RFC 9110 и сгруппированы по первой цифре (от 1xx до 5xx):

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

Практическое значение для тестирования:

  • 2xx — ожидаемый результат для успешных операций.
  • 4xx — указывают на проблему на стороне клиента (неправильные данные, отсутствие прав).
  • 5xx — сигнализируют о внутренних сбоях сервера.

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

import requests

# Тест на успешное создание ресурса
response = requests.post('https://api.example.com/users', json={"name": "Alice"})
assert response.status_code == 201, f"Expected 201, got {response.status_code}"
assert 'Location' in response.headers # Проверка заголовка с ссылкой на новый ресурс

# Тест на ошибку клиента (неверные данные)
response = requests.post('https://api.example.com/users', json={})
assert response.status_code == 400, f"Expected 400 for bad request, got {response.status_code}"

Ответ 18+ 🔞

Э, слушай, ну это ж классика, протоколы, блядь! HTTP статусы — это как язык, на котором сервер с клиентом переругиваются. Сука, если бы они матерились, то звучало бы примерно так.

Смотри, вся эта хуйня стандартизирована документом под названием RFC 9110. И вся соль в первой цифре кода, вот в этой, блядь, циферке. От неё всё и пляшет.

Группа Диапазон Что означает, если по-простому Примеры, чтоб ты запомнил
1xx — Информационные 100-199 «Я тебя услышал, не перебивай, я думаю, сука!» Клиент может не дергаться, ждать. 100 Continue (Продолжай слать), 101 Switching Protocols (Щас переключимся на другую волну)
2xx — Успешные 200-299 «Всё заебись, братан!» Запрос прошел на ура, сервер всё сделал. 200 OK (Всё ок), 201 Created (Создал твою хуйню), 204 No Content (Сделал, но тебе нихуя не отдам)
3xx — Перенаправления 300-399 «Не здесь, иди нахуй, в другое место!» Требует от клиента сделать лишнее движение. 301 Moved Permanently (Переехал насовсем, запомни новый адрес), 302 Found (Найден, но он временно в другом углу), 304 Not Modified (Не менялось, забирай из кэша, не дергай меня)
4xx — Ошибки клиента 400-499 «Сам дурак!» Проблема в запросе, который клиент отправил. Либо хуйню какую-то, либо прав нет. 400 Bad Request (Ты мне какую-то дичь прислал), 401 Unauthorized (Предъяви пропуск, падла), 403 Forbidden (Пропуск есть, но сюда тебе всё равно низя), 404 Not Found (Искомого объекта в этой вселенной не обнаружено, иди нахуй)
5xx — Ошибки сервера 500-599 «Моя вина, я обосрался!» Сервер не смог обработать даже нормальный запрос. Виноват он сам. 500 Internal Server Error (У меня внутри всё упало, сам не знаю почему), 502 Bad Gateway (Я спросил у соседа, а он мне какую-то хуйню ответил), 503 Service Unavailable (Я сейчас не в состоянии, занят, перезвони позже)

А теперь, блядь, зачем это всё тестировщику?

  • 2xx — это то, ради чего всё затевалось. Ожидаемый, ебать, результат. Если не 2xx — ищи, где накосячил.
  • 4xx — это тебе, клиент, сигнал: «Э, дружок-пирожок, посмотри-ка на свой запрос, там пиздец!». Ошибка в твоих данных или правах.
  • 5xx — вот тут уже волнение, ебать. Это сервер кричит «Караул!». Внутренние проблемы, пошли все по пизде. Надо бить тревогу.

Ну и как это в коде выглядит, чтоб ты понимал (Python, requests):

import requests

# Тест, когда всё должно быть заебись
response = requests.post('https://api.example.com/users', json={"name": "Alice"})
assert response.status_code == 201, f"Expected 201, got {response.status_code}"
assert 'Location' in response.headers # Проверяем, дал ли он нам ссылку на новосозданную сущность

# Тест, когда клиент (то есть мы в тесте) отправляет хуйню
response = requests.post('https://api.example.com/users', json={})
assert response.status_code == 400, f"Expected 400 for bad request, got {response.status_code}"

Вот и вся магия. Сервер либо кивает, либо посылает, либо признаётся, что сам — манда с ушами. Главное — различать, кто в конкретный момент манда.