使用 List 输入的 FastAPI POST 请求出现 422 错误

FastAPI POST request with List input got 422 error

嗨,我是 FastAPI 的新手,想编写一个 POST 请求,其中输入参数是一个列表,但我收到错误 422 无法处理的实体:

{
  "detail": [
    {
      "loc": [
        "body"
      ],
      "msg": "field required",
      "type": "value_error.missing"
    }
  ]
}

我的POST请求是:

@router.post('',status_code=200)
def register(reg_id: int, reg_name: str, reg_option_list:List[int]):
    reg_item = My_DB(
        id=reg_id,
        name=reg_name,
        option_list=reg_option_list,
    )
    item = db.query(My_DB).filter(My_DB.id == service_id).first()

    if item is not None:
        raise HTTPException(status_code=400, detail="Item exists.")
    db.add(reg_item)
    db.commit()
    return reg_item

但是当我像下面这样更改我的代码时,删除列表输入并将代码中的值设置为列表,一切正常:

@router.post('',status_code=200)
def register(reg_id: int, reg_name: str,):
    reg_item = My_DB(
        id=reg_id,
        name=reg_name,
        option_list=[1,2,3],
    )
    item = db.query(My_DB).filter(My_DB.id == service_id).first()

    if item is not None:
        raise HTTPException(status_code=400, detail="Item exists.")
    db.add(reg_item)
    db.commit()
    return reg_item

对于我的列表输入参数的任何帮助,我将不胜感激。谢谢

根据 documentation(查看“提示”部分)

To declare a query parameter with a type of list, like in the example above, you need to explicitly use Query, otherwise it would be interpreted as a request body.

因此,通过以您的方式声明 List 参数,端点希望将其作为 body 而不是 query 参数接收。因此,422 unprocessable entity 错误与您提供的具体细节有关(即缺少 body)。您还可以通过 OpenAPI 检查,例如 http://127.0.0.1:8000/docs。您会看到 reg_option_list 的值应在 Request body 部分给出。

这样做的方法是define the query parameter explicitly with Query,从而允许参数在URL中出现多次。示例如下:

from fastapi import Query
def register(reg_id: int, reg_name: str, reg_option_list: List[int] = Query(...)):

此外,请记住为您的路线提供路径名称,例如 /register,而不是空字符串 ''。要测试的示例 URL:

/register?reg_id=1&reg_name=foo&reg_option_list=1&reg_option_list=2&reg_option_list=3