首页 >后端开发 >Python教程 >如何修复 FastAPI 在 POSTing JSON 数据时出现的 422 错误?

如何修复 FastAPI 在 POSTing JSON 数据时出现的 422 错误?

Patricia Arquette
Patricia Arquette原创
2024-12-17 01:24:24644浏览

How to Fix FastAPI's 422 Error When POSTing JSON Data?

如何解决通过 POST 请求发送 JSON 数据时 FastAPI 的 422 错误

422 无法处理实体错误通常发生在请求的负载在语法上时正确,但与服务器的期望不符。在这种特定情况下,您遇到此错误是因为您的请求正在尝试将 JSON 数据发送到预期接收数据作为查询参数的端点。

要解决此问题,有多种方法 可用:

选项 1:利用 Pydantic模型

  • Pydantic 模型使您能够指定端点的预期数据结构。下面的代码片段说明了如何定义接受表示为 Pydantic 模型的 JSON 数据的端点:
from pydantic import BaseModel

class User(BaseModel):
    user: str

@app.post('/')
def main(user: User):
    return user

选项 2:使用主体参数

  • 如果不需要 Pydantic 模型,您可以利用 Body 参数。 'Body' 参数 embed 允许您将请求正文作为函数签名的一部分嵌入:
from fastapi import Body

@app.post('/')
def main(user: str = Body(..., embed=True)):
    return {'user': user}

选项 3:使用字典类型

  • 另一种方法(虽然不太推荐)是使用 Dict 类型来定义键值对。但是,此技术不支持自定义验证:
from typing import Dict, Any

@app.post('/')
def main(payload: Dict[Any, Any]):
    return payload

选项 4:直接访问请求正文

  • Starlette 的 Request 对象允许直接访问使用await request.json() 访问已解析的JSON 请求正文。但是,此方法不提供自定义验证,并且需要对端点定义使用 async def:
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())
    .then(data => {
        console.log(data);
    })
    .catch(error => {
        console.error(error);
    });

通过选择并实现其中一种方法,您可以成功处理 JSON 数据您的 FastAPI 端点,解决了 422 错误。

以上是如何修复 FastAPI 在 POSTing JSON 数据时出现的 422 错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn