参考内容:
Request Body
这里我们来介绍一下POST请求时,fastapi是如何接收请求体的
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
app = FastAPI()
@app.post("/items/")
async def create_item(item: Item):
return item
接下来,我们来拆解一下步骤:
1. 导入BaseModel
from pydantic import BaseModel
2. 声明请求体结构,这个结构体是一个继承了BaseModel
的类
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
如果指定了默认值,那么他就是非必填的;否则,这个参数就是必填的。
这里用None来表示参数为非必填,在传递参数时,可以不写这个参数
根据上面的结构体,我们可以这样传递参数:
{
"name": "Foo",
"description": "An optional description",
"price": 45.2,
"tax": 3.5
}
或者
{
"name": "Foo",
"price": 45.2
}
3. 将声明好的结构体添加到方法中
@app.post("/items/")
async def create_item(item: Item):
return item
这时,我们的接口已经初步完成,当有请求进来是,fastapi会这样做:
- 读取json格式的请求体
- 将参数转换为对应的类型
- 验证数据是否合法,如果不符合定义的类型会返回错误的字段及错误的原因
运行服务,打开http://127.0.0.1:8000/docs
,可以看到:
Request body + path + query parameters
在fastapi教程——进阶(一)我们已经学过了如何声明path和query参数,接下来我们把它们整理到一起:
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
app = FastAPI()
@app.put("/items/{item_id}")
async def create_item(item_id: int, item: Item, q: Optional[str] = None):
result = {
"item_id": item_id, **item.dict()}
if q:
result.update({
"q": q})
return result
这个接口的方法将会这样获取参数:
- 如果在路径中声明了该参数,那么他就会被传递给
item_id
- 如果在查询参数中指定了参数,那么他就会被传递给
q
- 如果在请求体中指定了参数,那么他就会被传递给
item
上述栗子均放到git上啦,地址:戳这里