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):
我想创建一个只接受任意 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):