在 FastAPI 中请求端点时出现“解析正文时出错”错误

问题描述 投票:0回答:2

我已经在 FastAPI 中实现了一个端点,并且正在从 Postman 测试它。但是每当我发送请求时,我都会收到此错误“解析正文时出错”,在搜索错误时,我在需要安装 python-multipart 的地方找到了一个解决方案,这个包已经安装了,但我仍然面临这个问题错误。 以下是我的代码:

@router.put('/user')
def update_user(user_data: dict):
    from crain.uma import update_user
    user_id = user_data['id']
    update_user(user_id, user_data)
    return {"message": "DONE"}

除了这样的字典之外的端点:

user_data =    {
      "username":"admin",
      "id":"2d06aa3b-c25a-4499-948a-86341ac4adc5",
      "email":null,
      "firstName":"admin",
      "lastName":"admin",
      "createdTimestamp":1638268009973
   },

python json postman fastapi
2个回答
3
投票

简而言之,您的端点需要

JSON
数据,但您的客户端却发送
form-data
。因此,通过 Postman 发送请求时,您应该转到
Body
,然后选择
raw
,最后从下拉列表中选择
JSON
,如这个答案中所述。

此外,我强烈建议使用 Pydantic 模型来发送 JSON 数据,如文档中所述。因此,您可以利用 Pydantic 提供的数据验证。您甚至可以使用

EmailStr
类型来验证电子邮件输入(需要安装 email-validator,如文档中所述)。下面的例子:

from pydantic import BaseModel, EmailStr
from datetime import datetime
class User(BaseModel):
    username: str
    id: str
    email: EmailStr = None
    firstName: str
    lastName: str
    createdTimestamp: datetime
    
@app.put('/user')
def update_user(user_data: User):
    from crain.uma import update_user
    user_data = user_data.dict()
    user_id = user_data['id']
    update_user(user_id, user_data)
    return {"message": "DONE"}

JSON 有效负载应如下所示:

{
    "username":"admin",
    "id":"2d06aa3b-c25a-4499-948a-86341ac4adc5",
    "email":null,
    "firstName":"admin",
    "lastName":"admin",
    "createdTimestamp":1638268009973
}

2
投票

在邮递员中切换到

raw
数据(当前您位于
form-data
)。
然后插入您想要的有效负载:

{
      "username":"admin",
      "id":"2d06aa3b-c25a-4499-948a-86341ac4adc5",
      "email":null,
      "firstName":"admin",
      "lastName":"admin",
      "createdTimestamp":1638268009973
}

并触发请求。

顺便说一句,当你说

除了这样的字典之外的端点:

user_data = {  
      "username":"admin",  
      "id":"2d06aa3b-c25a-4499-948a-86341ac4adc5",  
      "email":null,  
      "firstName":"admin",  
      "lastName":"admin",  
      "createdTimestamp":1638268009973
},

你实际上的意思是端点只期望字典部分,因为

user_data
只是Python代码中的一个变量名,与任何请求配置完全无关。
我指定它的原因是因为您将其写为
key
您邮递员的要求
form-data
(您上传的图片)

© www.soinside.com 2019 - 2024. All rights reserved.