Request Body
当需要从客户端(如浏览器)发送数据到 API 时,可以借助 request body
request body:从客户端发送到 API 的数据
response body:从 API 发送到客户端的数据
API 总是需要发送 response body,但是客户端并不一定需要发送 request body
借助 Pydantic 来声明 request body
注:
通常不用
GET
发送 request body (实际上GET
好像也是可以发送的)通常用:
POST
(最常见),PUT
,DELETE
,PATCH
中的一种发送数据
Pydantic example
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
app = FastAPI()
@app.post("/items/")
async def create_item(item: Item):
return item
声明 request body 步骤:
- 导入
BaseModel
- 定义数据模型并继承于
BaseModel
:- 要注意声明 Python types
- 和声明查询参数一样,当模型的属性有默认值时,该属性不是必须的,否则是必须的,用
None
声明可选参数
- 声明数据模型为参数:
- 类似路径参数和查询参数一样,将其加入到函数参数中,并声明类型为自定义的数据类型
Results
使用上述的声明,FastAPI 将会:
- 以 JSON 格式读取 request body
- 将数据转化为相应的类型(如果需要的话)
- 验证数据:
- 如果不合法,将会返回错误信息
- 以定义的数据类型返回接受的数据,在上述例子中,request body 被转化为 Item 类型:
- 如果在函数中声明了定义的数据类型,还将获得 IDE 支持
- 为模型自动生成 JSON 模式定义
- 这些协议将作为自动生成的 OpenAPI 的协议,并用作文档的自动生成
Automatic docs
自定义模型的 JSON 协议将会作为自动生成 OpenAPI 协议的一部分,并且会通过交互式 API 文档展现
它们也会被用在每个需要path operation的 API 文档上
Editor support
IDE 将支持类型提示和自动补全,以及错误检查
Use the model
在函数中,可以直接访问所有数据模型的属性(和正常的访问没有区别)
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
app = FastAPI()
@app.post("/items/")
async def create_item(item: Item):
item_dict = item.dict()
if item.tax:
price_with_tax = item.price + item.tax
item_dict.update({"price_with_tax": price_with_tax})
return item_dict
Request body + path parameters
可以同时声明路径参数和 request body
FastAPI 能够自动识别函数参数中从路径中得到的路径参数和 request body 中获得的 Pydantic models
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
app = FastAPI()
@app.put("/items/{item_id}")
async def create_item(item_id: int, item: Item):
return {"item_id": item_id, **item.dict()}
Request body + path + query parameters
可以同时声明路径参数、request body 以及查询参数
FastAPI 能够自动识别它们
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
app = FastAPI()
@app.put("/items/{item_id}")
async def create_item(item_id: int, item: Item, q: str = None):
result = {"item_id": item_id, **item.dict()}
if q:
result.update({"q": q})
return result
函数参数的识别遵循:
- 如果参数出现在 path 中,则为路径参数
- 如果参数具有单一的类型,则为查询参数
- 如果被声明为 Pydantic model,则为 request body
Without Pydantic
可以使用 Body parameters 代替 Pydantic model