8

我想创建一个 FastAPI 端点,它只接受任意发布请求正文并返回它。

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

我试过:

from fastapi import FastAPI
app = FastAPI()

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

但无论我发送什么,它都会返回一个空字典。

有任何想法吗?

4

2 回答 2

14

你可以使用类型提示 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
于 2020-06-08T17:22:31.323 回答
1

只要输入包含在字典中,接受的答案就有效。即:以 a 开头,以 a{结尾}。但是,这并不涵盖所有有效的 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并且也是一个空的身体。您可以关闭该部分,然后要求请求正文不为空/空。

如果您使用的是 Python3.10,那么您可以摆脱Union并将定义编写为:

async def handle(request: List | Dict | Any = None):
于 2022-01-27T13:48:12.393 回答