FastAPI/Pydantic 接受任意 post 请求正文?

FastAPI/Pydantic accept arbitrary post request body?

我想创建一个只接受任意 post 请求主体和 returns 它的 FastAPI 端点。

如果我发送 {"foo" : "bar"} ,我想取回 {"foo" : "bar"} 。但我也希望能够发送 {"foo1" : "bar1", "foo2" : "bar2"} 并取回它。

我试过:

from fastapi import FastAPI
app = FastAPI()

app.post("/")
async def handle(request: BaseModel):
    return request

但是那个returns一个空字典,不管我发什么。

有什么想法吗?

您可以使用类型提示 Dict[Any, Any] 来告诉 FastAPI 您期望任何有效的 JSON:

from typing import Any, Dict
from fastapi import FastAPI

app = FastAPI()

@app.post("/")
async def handle(request: Dict[Any, Any]):
    return request

只要输入包含在字典中,接受的答案就有效。即:以 { 开始,以 } 结束。但是,这并不涵盖所有有效的 JSON 输入。例如,以下有效的 JSON 输入将失败:

  • true / false
  • 1.2
  • null
  • "text"
  • [1,2,3]

为了让端点接受真正通用的 JSON 输入,以下方法可行:

from typing import Any, Dict, List, Union
from fastapi import FastAPI

app = FastAPI()

@app.post("/")
async def handle(request: Union[List,Dict,Any]=None):
    return request

仅使用 Any 出于某种原因无效。当我使用它时,FastApi 期待来自查询参数的输入,而不是来自请求正文的输入。

=None 使它接受 null 和一个空体。您可以将该部分保留下来,然后要求请求主体不是 empty/null.

如果您使用 Python3.10,那么您可以去掉 Union 并将定义写为:

async def handle(request: List | Dict | Any = None):