带有列表输入的 FastAPI POST 请求引发 422 无法处理的实体错误

2025-03-04 08:27:00
admin
原创
156
摘要:问题描述:我想编写POST一个输入参数为 的请求list,但是出现错误422 unprocessable entity:{ "detail": [ { "loc": [ "body" ], ...

问题描述:

我想编写POST一个输入参数为 的请求list,但是出现错误422 unprocessable entity

{
  "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输入参数的帮助。谢谢。


解决方案 1:

根据文档(请参阅“提示”部分)

要声明类型为 的查询参数list,如上例所示,您需要明确使用 Query,否则它将被解释为request body

List因此,通过以您的方式声明参数,端点将期望在请求中接收它body,而不是在查询字符串中作为query参数接收它。因此,422 unprocessable entity会引发错误,包括您提供的特定详细信息(即body缺少字段)。您还可以通过 OpenAPI/Swagger UI 确认这一点/docs,例如http://127.0.0.1:8000/docs。您会看到的值reg_option_list应该传递给Request body部分,而不是在查询参数中。

选项 1 -List在查询字符串中发送数据

实现此目的的方法是使用 ; 明确定义查询参数Query,从而允许参数在 URL 中多次出现。由于这样的请求不包含请求主体,因此您应该使用请求GET,它用于从服务器请求数据,而POST用于将存储在请求主体中的数据发送到服务器。

例子

from fastapi import FastAPI, Query
from typing import List


app = FastAPI()


@app.get('/')
def register(reg_id: int, reg_name: str, reg_options: List[int] = Query(...)):
    return reg_options

测试带Query参数的ListURL :

http://127.0.0.1:8000/?reg_id=1&reg_name=foo&reg_options=1&reg_options=2&reg_options=3

使用 Python 请求进行测试:

import requests

url = 'http://127.0.0.1:8000/?reg_id=1&reg_name=foo&reg_options=1&reg_options=2&reg_options=3'
r = requests.get(url)
print(r.text)

或者,最好:

import requests

url = 'http://127.0.0.1:8000/'
params = {'reg_id': 1, 'reg_name': 'foo', 'reg_options': [1, 2, 3]}
r = requests.get(url, params=params)
print(r.text)

选项 2 -List在请求正文中发送数据

如果您想使用POST请求并在请求正文中发送数据,则可以简单地reg_options以相同的方式定义上面的参数,不使用该= Query(...)部分。 这应该告诉 FastAPI 在请求正文中期望该端点的数据列表。 有关如何将请求正文中的数据发送到 FastAPI 后端的更多详细信息和示例,请查看此处以及此处和此处。 更多相关答案可以在这里、此处以及这里和这里找到。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3998  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2749  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   85  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   96  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   83  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用