FastAPI:使用 JSON 数据处理 POST 请求
构建 API 时,处理不同类型的 HTTP 请求至关重要。虽然 GET 请求工作顺利,但 POST 请求经常遇到错误,尤其是在发送 JSON 数据时。为了解决 FastAPI 中 POST 请求常见的“422 Unprocessable Entity”错误,我们探索了定义需要 JSON 数据的端点的不同方法。
方法 1:使用 Pydantic 模型
要定义接受 JSON 数据的请求正文,您可以使用 Pydantic 模型。使用所需字段创建模型并将其合并到端点定义中。
from pydantic import BaseModel class User(BaseModel): user: str @app.post('/') def main(user: User): return user
方法 2:使用 Embed 的主体参数
如果您不想使用 Pydantic模型,您可以将 Body 参数与 embed 选项一起使用。这允许您直接将请求正文作为函数中的字段进行访问。
from fastapi import Body @app.post('/') def main(user: str = Body(..., embed=True)): return {'user': user}
方法 3:字典参数(不太推荐)
不太推荐的方法涉及使用字典类型作为参数。但是,此方法不提供属性的自定义验证,并且限制了灵活性。
from typing import Dict, Any @app.post('/') def main(payload: Dict[Any, Any]): return payload
方法 4:使用 FastAPI 请求对象
如果您有信心传入的 JSON 数据,您可以使用 FastAPI 请求对象直接访问它。请记住,此方法需要使用 async def 定义您的端点。
from fastapi import Request @app.post('/') async def main(request: Request): return await request.json()
测试您的代码
要测试您的端点,您可以使用 Python requests 库或JavaScript Fetch API。
使用 Python请求:
import requests url = 'http://127.0.0.1:8000/' payload ={'user': 'foo'} resp = requests.post(url=url, json=payload) print(resp.json())
使用 JavaScript Fetch API:
fetch('/', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({'user': 'foo'}) }) .then(resp => resp.json()) // or, resp.text(), etc .then(data => { console.log(data); // handle response data }) .catch(error => { console.error(error); });
根据您的具体要求选择适当的方法并考虑各种测试选项,您可以在 FastAPI 中有效处理带有 JSON 数据的 POST 请求。
以上是如何在FastAPI中有效处理带有JSON数据的POST请求?的详细内容。更多信息请关注PHP中文网其他相关文章!