首页 > web前端 > js教程 > FastAPI接收JSON POST请求时出现422错误如何处理?

FastAPI接收JSON POST请求时出现422错误如何处理?

Susan Sarandon
发布: 2024-12-16 09:26:10
原创
943 人浏览过

How to Handle FastAPI's 422 Error When Receiving JSON POST Requests?

FastAPI:发送 JSON 数据时出现 POST 请求错误 422

构建 RESTful API 时,经常会遇到与数据交换相关的问题,尤其是涉及 POST 请求时。其中一个问题是在尝试发送 JSON 数据时收到“422 Unprocessable Entity”错误。

在提供的代码示例中:

from fastapi import FastAPI

app = FastAPI()

@app.post("/")
def main(user):
    return user
登录后复制

此代码定义了一个需要 JSON 的 POST 端点包含“用户”密钥的有效负载。但是,当 HTTP 客户端发送与预期格式不匹配的 JSON 数据时,就会发生错误。为了解决这个问题,有几个选项:

选项 1:使用 Pydantic 模型

Pydantic 模型提供了一种根据预定义模式验证和反序列化 JSON 负载的方法:

from pydantic import BaseModel

class User(BaseModel):
    user: str

@app.post("/")
def main(user: User):
    return user
登录后复制

选项2:使用Body参数

FastAPI中的Body参数可以让你直接解析无需定义 Pydantic 模型的 JSON 负载:

from fastapi import Body

@app.post("/")
def main(user: str = Body(..., embed=True)):
    return {'user': user}
登录后复制

选项 3:使用 Dict 类型

虽然不太推荐,但您可以使用 Dict 类型来接收 JSON 负载作为键值对:

from typing import Dict, Any

@app.post("/")
def main(payload: Dict[Any, Any]):
    return payload
登录后复制

选项 4:直接使用请求正文

如果您确定传入的数据是有效的 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板