构建 RESTful API 时,经常会遇到与数据交换相关的问题,尤其是涉及 POST 请求时。其中一个问题是在尝试发送 JSON 数据时收到“422 Unprocessable Entity”错误。
在提供的代码示例中:
from fastapi import FastAPI app = FastAPI() @app.post("/") def main(user): return user
此代码定义了一个需要 JSON 的 POST 端点包含“用户”密钥的有效负载。但是,当 HTTP 客户端发送与预期格式不匹配的 JSON 数据时,就会发生错误。为了解决这个问题,有几个选项:
Pydantic 模型提供了一种根据预定义模式验证和反序列化 JSON 负载的方法:
from pydantic import BaseModel class User(BaseModel): user: str @app.post("/") def main(user: User): return user
FastAPI中的Body参数可以让你直接解析无需定义 Pydantic 模型的 JSON 负载:
from fastapi import Body @app.post("/") def main(user: str = Body(..., embed=True)): return {'user': user}
虽然不太推荐,但您可以使用 Dict 类型来接收 JSON 负载作为键值对:
from typing import Dict, Any @app.post("/") def main(payload: Dict[Any, Any]): return payload
如果您确定传入的数据是有效的 JSON,您可以使用 Starlette 的 Request 对象来解析它:
from fastapi import Request @app.post("/") async def main(request: Request): return await request.json()
您可以使用以下命令测试这些选项:
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); });
通过实施其中一种方法,您可以解决 422 错误并成功处理 FastAPI POST 端点中的 JSON 数据。
以上是FastAPI接收JSON POST请求时出现422错误如何处理?的详细内容。更多信息请关注PHP中文网其他相关文章!