请求体是客户端发送给API的数据,fastApi使用 Pydantic 模型来声明请求体
不能使用 GET操作(HTTP 方法)发送请求体。
要发送数据,必须使用下列方法之一:POST
(较常见)、PUT
、DELETE
或 PATCH
创建数据类型
from pydantic import BaseModelclass Item(BaseModel):name: strdescription: str | None = Noneprice: floattax: float | None = None
和查询参数一样,当一个模型属性具有默认值时,它不是必须的,否则它是一个必须属性,如果默认值为None,那么它是可选属性
声明为参数
from fastapi import FastAPI
from pydantic import BaseModelclass Item(BaseModel):name: strdescription: str | None = Noneprice: floattax: float | None = Noneapp = FastAPI()@app.post("/items/")
async def create_item(item: Item):return item
使用与声明路径和查询参数的相同方式声明请求体,即可将其添加到「路径操作」中,同时将它的类型声明为创建的Item模型
由于description和tax是可选参数,这两种请求入参都是可行的。
{"name": "Foo","description": "An optional description","price": 45.2,"tax": 3.5
}{"name": "Foo","price": 45.2
}
使用模型
from fastapi import FastAPI
from pydantic import BaseModelclass Item(BaseModel):name: strdescription: str | None = Noneprice: floattax: float | None = Noneapp = FastAPI()@app.post("/items/")
async def create_item(item: Item):item_dict = item.dict()if item.tax:price_with_tax = item.price + item.taxitem_dict.update({"price_with_tax": price_with_tax})return item_dict
在函数内部,可以直接访问模型对象的所有属性
请求体+路径参数+查询参数
函数参数将依次按如下规则进行识别:
- 如果在路径中也声明了该参数,它将被用作路径参数。
- 如果参数属于单一类型(比如
int
、float
、str
、bool
等)它将被解释为查询参数。 - 如果参数的类型被声明为一个 Pydantic 模型,它将被解释为请求体。
from fastapi import FastAPI
from pydantic import BaseModelclass Item(BaseModel):name: strdescription: str | None = Noneprice: floattax: float | None = Noneapp = FastAPI()@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item, q: str | None = None):result = {"item_id": item_id, **item.dict()}if q:result.update({"q": q})return result