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

我已经在 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"}

除了这样的dict之外的端点:

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

enter image description here enter image description here

stack overflow "There was an error parsing the body" error on requesting endpoint in FastAPI
原文答案
author avatar

接受的答案

在邮递员中切换到 raw 数据(当前您在 form-data 中)。
然后插入您想要的有效载荷:

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

并触发请求。

顺便说一句,当你说

除了这样的 dict 之外的端点:

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

您实际上的意思是端点只需要字典部分,因为 user_data 只是您的 python 代码中的一个变量名,与任何请求配置完全无关。
我指定它的原因是因为您将其写为 key 您是邮递员的请求 form-data (您上传的图片)


答案:

作者头像

简而言之,您的端点需要 JSON 数据,但您的客户端发送 form-data 代替。因此,当发送请求时,请选择 raw 数据,如 this answer 中所述。

另外,我强烈建议使用 Pydantic 模型来发送 JSON 数据,如 documentation 中所述。因此,您可以利用 Pydantic 提供的数据验证。您甚至可以使用 EmailStr 类型来验证电子邮件输入(需要安装 email-validator ,如 documentation 中所述)。下面的例子:

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
}