使用 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®_name=foo®_option_list=1®_option_list=2®_option_list=3
嗨,我是 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 useQuery
, 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®_name=foo®_option_list=1®_option_list=2®_option_list=3