使用 FastAPI 构建 API,该应用程序在通过 POST 请求发送 JSON 数据时显示错误代码 422(无法处理的实体)。另一方面,GET 请求则运行顺利。尽管尝试解析 JSON、使用 UTF-8 编码或修改 HTTP 标头,此问题仍然存在。
带有 422 状态代码的响应表示提交的数据出现错误,通常是由于元素缺失或格式不正确造成的。在本例中,问题源于 POST 请求的预期格式。默认情况下,FastAPI 将用户输入视为查询参数,而不是 JSON 负载。因此,客户端尝试传输 JSON 数据会导致 422 错误。
以下四个选项提供了不同的方法来正确定义端点处理来自 POST 请求的 JSON 数据:
使用 Pydantic 模型使您能够为端点指定预期的数据结构。
from pydantic import BaseModel class User(BaseModel): user: str @app.post('/') def main(user: User): return user
此方法利用特殊的“embed”参数将主体视为单个参数。
from fastapi import Body @app.post('/') def main(user: str = Body(..., embed=True)): return {'user': user}
虽然不太推荐,但此方法将键值对定义为 Dict 类型。
from typing import Dict, Any @app.post('/') def main(payload: Dict[Any, Any]): return payload
此选项涉及使用请求对象来解析接收到的 JSON 数据。
from fastapi import Request @app.post('/') async def main(request: Request): return await request.json()
要测试提供的解决方案,请按照给定的步骤:
import requests url = 'http://127.0.0.1:8000/' payload ={'user': 'foo'} resp = requests.post(url=url, json=payload) print(resp.json())
fetch('/', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({'user': 'foo'}) }) .then(resp => resp.json()) .then(data => { console.log(data); }) .catch(error => { console.error(error); });
以上是FastAPI POST 请求错误 422:如何正确处理 JSON 数据?的详细内容。更多信息请关注PHP中文网其他相关文章!