【问题标题】:FASTAPI: Getting Error 422 : Unprocessable Entity when trying to pass a json object inside bodyFASTAPI:出现错误 422:尝试在正文中传递 json 对象时无法处理的实体
【发布时间】:2022-01-24 17:00:23
【问题描述】:

我还没有看到我的问题的答案,所以在这里。

我正在尝试传递一个 json 对象,例如:在 fastapi 中的 post 请求的正文中,以便稍后将其存储在数据库中或以任何方式处理它

{
  "action_reaction": {
    "action": {
      "name": "test"
    },
    "reaction": {
      "name2": "test2"
    }
  }
}

这是我的代码:

class AddActionModel(BaseModel):
    action_reaction: str = None

@router.post("/add_reaction")
async def add_action_reaction(addActionModel: AddActionModel, x_token: str = Header(None)):
    print(f'addActionModel: {addActionModel}')

    action_reactions = json.loads(addActionModel.action_reaction)
    action = action_reactions["action"]
    reaction = action_reactions["reaction"]
    return {"success": True}

问题是我总是得到这样的回应:

有人知道怎么做吗?

谢谢

【问题讨论】:

    标签: python json fastapi


    【解决方案1】:

    您发送的 JSON 无效。

    您的代码需要一个包含字符串值的 JSON 对象,您正在服务器端对其进行解码。

    为了使您的请求有效,您希望转义 action_reaction 中的引号,如下所示:

    {
        "action_reaction": "{\"action\": {\"name\": \"test\"}, \"reaction\": {\"name2\": \"test2\"}}"
    }
    

    替代方案: implement a nested model 用于所有对象:

    class Event(BaseModel):
        name: str
    
    class ActionReaction(BaseModel):
       action: Event
       reaction: Event
    
    class AddActionModel(BaseModel):
        action_reaction: ActionReaction = None
    

    如果你这样定义,那么后端不需要json.loads,因为整个对象都会被FastAPI + Pydantic解析。

    【讨论】:

    • 谢谢你现在的作品!
    猜你喜欢
    • 2022-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-07
    • 2021-02-17
    • 2021-05-26
    • 1970-01-01
    相关资源
    最近更新 更多