Каковы основные причины и способы диагностики HTTP-ошибки 400 (Bad Request)?

«Каковы основные причины и способы диагностики HTTP-ошибки 400 (Bad Request)?» — вопрос из категории HTTP и веб-протоколы, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ошибка 400 Bad Request указывает, что сервер не может обработать запрос из-за некорректного синтаксиса или структуры со стороны клиента.

Основные причины:

  1. Неверный формат или синтаксис тела запроса: Невалидный JSON/XML (пропущена кавычка, запятая).
  2. Некорректные параметры:
    • Неверный тип данных в поле (строка вместо числа).
    • Отсутствие обязательного поля.
    • Значение поля, не соответствующее ожидаемому формату (например, email без @).
  3. Проблемы с заголовками (Headers): Отсутствующий или неверный Content-Type (например, отправка JSON с Content-Type: text/plain).
  4. Недопустимый размер запроса (если превышен лимит, установленный сервером).

Алгоритм диагностики:

  1. Проверьте точность запроса: Сравните с документацией API (Swagger/OpenAPI).
  2. Валидируйте входные данные: Убедитесь, что все поля и их типы соответствуют спецификации.
  3. Используйте инструменты:
    • Postman/Insomnia: Удобны для ручной проверки и просмотра raw-запроса.
    • Логирование: Включите детальное логирование исходящего запроса в вашем коде.

Пример теста на валидацию:

import requests
import pytest

# ТЕСТ 1: Отправка строки вместо числа в поле 'age'
def test_400_on_invalid_type():
    url = "https://api.example.com/users"
    payload = {"name": "John", "age": "thirty"}  # Поле 'age' ожидает число
    headers = {"Content-Type": "application/json"}

    response = requests.post(url, json=payload, headers=headers)

    # Ожидаем 400, так как тип данных неверный
    assert response.status_code == 400, f"Expected 400, got {response.status_code}. Response: {response.text}"
    # В ответе сервера часто есть детали ошибки
    error_detail = response.json().get('detail', '')
    assert "age" in error_detail and "number" in error_detail.lower()
  1. Проверьте логи сервера: Там часто содержится более подробное описание ошибки (например, от библиотеки валидации Pydantic или JSON-парсера).