Receive JSON
data
你通常会使用用于声明请求主体的 Pydantic 模型- 如果您要接收数据JSON
形式 - 因此受益于验证Pydantic必须提供(有关如何发布的更多选项JSON
数据,看一下这个答案)。因此,您可以定义这样的模型:
from pydantic import BaseModel
class Item(BaseModel):
token: str
team_id: str
team_domain: str
# etc.
@app.post("/")
def root(item: Item):
print(item.dict()) # convert to dictionary (if required)
return item
有效负载如下所示:
{
"token": "gIkuvaNzQIHg97ATvDxqgjtO"
"team_id": "Foo",
"team_domain": "bar",
# etc.
}
Receive Form
data
但是,如果您即将收到有效负载Form data,就像 slack API 所做的那样(如link你提供的),你可以使用Form字段。和Form
字段,您的有效负载仍将根据这些字段以及您定义它们的类型进行验证。但是,您需要定义端点中的所有参数,如上面的链接所述,如下所示:
from fastapi import Form
@app.post("/")
def root(token: str = Form(...), team_id: str = Form(...), team_domain: str = Form(...)):
return {"token": token, "team_id": team_id, "team_domain": team_domain}
或者避免在端点中指定参数,以防您有大量Form
字段,您可以创建一个自定义依赖类(使用@dataclass装饰器,为了简单起见),这将允许您定义多个Form
单独类中的字段,并且仅在端点中使用该类定义 - 请参阅这个答案 and 这个答案有关 FastAPI 依赖项的更多详细信息。例子:
from dataclasses import dataclass
from fastapi import FastAPI, Form, Depends
@dataclass
class Item:
token: str = Form(...)
team_id: str = Form(...)
team_domain: str = Form(...)
#...
@app.post("/")
def root(data: Item = Depends()):
return data
由于 FastAPI 实际上是 Starlette,即使您仍然必须按照问题中的方式访问请求正文,您也应该使用以下方法request.json()
or request.form()
,如中所述星光文档,这将允许您将请求正文解析为JSON
or form-data
, 分别。请看一下这个答案了解更多详细信息和示例。