首页 >后端开发 >Python教程 >FastAPI POST 请求错误 422:如何正确处理 JSON 数据?

FastAPI POST 请求错误 422:如何正确处理 JSON 数据?

Patricia Arquette
Patricia Arquette原创
2025-01-03 01:19:38134浏览

FastAPI POST Request Error 422: How to Properly Handle JSON Data?

FastAPI:了解并解决通过 POST 请求发送 JSON 数据时出现的错误 422

问题描述

使用 FastAPI 构建 API,该应用程序在通过 POST 请求发送 JSON 数据时显示错误代码 422(无法处理的实体)。另一方面,GET 请求则运行顺利。尽管尝试解析 JSON、使用 UTF-8 编码或修改 HTTP 标头,此问题仍然存在。

详细说明

带有 422 状态代码的响应表示提交的数据出现错误,通常是由于元素缺失或格式不正确造成的。在本例中,问题源于 POST 请求的预期格式。默认情况下,FastAPI 将用户输入视为查询参数,而不是 JSON 负载。因此,客户端尝试传输 JSON 数据会导致 422 错误。

解决方案选项

以下四个选项提供了不同的方法来正确定义端点处理来自 POST 请求的 JSON 数据:

1。使用 Pydantic 模型

使用 Pydantic 模型使您能够为端点指定预期的数据结构。

from pydantic import BaseModel

class User(BaseModel):
    user: str

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

2.使用主体参数嵌入

此方法利用特殊的“embed”参数将主体视为单个参数。

from fastapi import Body

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

3.使用 Dict 类型(不太推荐)

虽然不太推荐,但此方法将键值对定义为 Dict 类型。

from typing import Dict, Any

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

4 。直接使用请求对象

此选项涉及使用请求对象来解析接收到的 JSON 数据。

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);
    });

以上是FastAPI POST 请求错误 422:如何正确处理 JSON 数据?的详细内容。更多信息请关注PHP中文网其他相关文章!

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