簡體   English   中英

帶有 List 輸入的 FastAPI POST 請求引發 422 Unprocessable Entity 錯誤

[英]FastAPI POST request with List input raises 422 Unprocessable Entity 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

對於我的列表輸入參數的任何幫助,我將不勝感激。 謝謝。

根據文檔(查看“提示”部分)

要聲明類型為list的查詢參數,如上例所示,您需要顯式使用Query ,否則它將被解釋為request body

因此,通過以您的方式聲明List參數,端點將期望將其作為body而不是query參數接收。 因此, 422 unprocessable entity error 與您提供的特定詳細信息(即缺少body字段)有關。 您還可以通過 OpenAPI/Swagger UI 檢查,例如http://127.0.0.1:8000/docs 您會看到reg_option_list的值應該傳遞給Request body部分。

這樣做的方法是使用Query顯式定義查詢參數,從而允許該參數在 URL 中多次出現。示例如下:

from fastapi import Query

@router.post('/')
def register(reg_id: int, reg_name: str, reg_option_list: List[int] = Query(...)):
    # ...

示例 URL 查詢字符串:

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

您可以使用默認類型的查詢

from typing import List

from fastapi import FastAPI, Query

app = FastAPI()
@app.get("/items/")
def read_items(q: List[int] = Query(None)):
    return {"q": q}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM