Ответ
Ошибка 400 Bad Request указывает, что сервер не может обработать запрос из-за некорректного синтаксиса или структуры со стороны клиента.
Основные причины:
- Неверный формат или синтаксис тела запроса: Невалидный JSON/XML (пропущена кавычка, запятая).
- Некорректные параметры:
- Неверный тип данных в поле (строка вместо числа).
- Отсутствие обязательного поля.
- Значение поля, не соответствующее ожидаемому формату (например,
emailбез@).
- Проблемы с заголовками (Headers): Отсутствующий или неверный
Content-Type(например, отправка JSON сContent-Type: text/plain). - Недопустимый размер запроса (если превышен лимит, установленный сервером).
Алгоритм диагностики:
- Проверьте точность запроса: Сравните с документацией API (Swagger/OpenAPI).
- Валидируйте входные данные: Убедитесь, что все поля и их типы соответствуют спецификации.
- Используйте инструменты:
- 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()
- Проверьте логи сервера: Там часто содержится более подробное описание ошибки (например, от библиотеки валидации Pydantic или JSON-парсера).