Ошибка 422 Unprocessable Entity возникает, когда сервер понимает содержимое запроса, но не может его обработать из-за логических или валидирующих ошибок. В случае с вашим кодом, это может происходить по нескольким причинам. Рассмотрим наиболее распространенные проблемы и их решения:
1. **Типы данных**: Убедитесь, что данные, отправляемые API, имеют правильные типы. Например, `amount_crypto` должен быть числом с плавающей точкой. Если отправляется строка, например, "10.0" вместо 10.0, это может вызвать ошибку.
2. **Пропущенные поля**: Убедитесь, что все обязательные поля действительно передаются в запросе. Это особенно актуально для формы, так как она не допускает пустых значений для полей, помеченных как `Form(...)`.
3. **Неверное кодирование**: Если вы отправляете данные в формате `application/x-www-form-urlencoded`, убедитесь, что формат запроса совпадает и приемник обрабатывает данные корректно.
4. **Логирование ошибок**: В вашем коде вы уже ведете логирование, но дополнительно уточните, какие именно поля передаются в запросе и каковы их значения. Это поможет в диагностике.
5. **Модель данных**: Для упрощения валидирования данных и улучшения читаемости можно использовать Pydantic модели вместо отдельных аргументов функции. Это позволит вам сделать валидацию более упрощенной и централизованной.
Попробуйте использовать следующий пример:
```python
from fastapi import FastAPI, HTTPException, Form
from pydantic import BaseModel
import logging
# Настройка логирования
logging.basicConfig(level=logging.INFO)
api_app = FastAPI()
class CallbackData(BaseModel):
status: str
invoice_id: str
amount_crypto: float
currency: str
order_id: str
token: str
@api_app.post("/callback")
async def handle_callback(data: CallbackData):
"""
Обработка POST-запросов с Content-Type: application/json.
"""
try:
# Логирование входящих данных
logging.info(f"Полученные данные: {data.json()}")
# Логика обработки данных...
except Exception as e:
logging.error(f"Ошибка обработки: {e}")
raise HTTPException(status_code=500, detail="Ошибка обработки запроса")
```
В этом примере используется модель `CallbackData` для валидации входящих данных. Это упрощает обработку и делает код более чистым. Обратите внимание, что формат запроса должен быть изменен на `application/json`, если вы используете модели Pydantic.
Если вы хотите оставить загрузку через форму (x-www-form-urlencoded), можно оставить свой текущий код, но убедитесь, что вы получаете именно те данные, которые ожидаете. Логирование полученных данных на первом этапе может быть наиболее полезным для нахождения проблемы.