何为请求体
顾名思义,请求体就是在请求过程中客户端携带的数据
请求体不是一定要携带的,而且请求体不建议用 GET
请求发送,通常我们会使用 POST
请求发送请求体,当然是用 PUT
、DELETE
、PATCH
方式也可以发送请求体
请求体校验
通常,我们在开发的时候,需要用户根据特定的结构体来发起请求,从而防止攻击和过滤用户
FastApi 的数据模型
在 FastApi
中,我们可以借助 pydantic
的 BaseModel
类来实现请求结构体的定义
代码
from pydantic import BaseModel
class Mds(BaseModel):
name: str
age: int
home: str
@app.post('/models/')
async def add_model(model:Mds):
return model
接口测试
正常情况
jopa@jopa-PC:~$ curl -X 'POST' 'http://127.0.0.1:8000/models/' -H 'Content-Type: application/json' -d '{"name": "testname", "age": 18, "home": "hunan"}'
{"name":"testname","age":18,"home":"hunan"}
异常情况
jopa@jopa-PC:~$ curl -X 'POST' 'http://127.0.0.1:8000/models/' -H 'Content-Type: application/json' -d '{"name": "testname", "age": 18}'
{"detail":[{"type":"missing","loc":["body","home"],"msg":"Field required","input":{"name":"testname","age":18}}]}
对于错误的,缺失的结构体字段,FastApi
都会帮我们检测处理
可选字段
FastApi
的可选字段有以下两种场景
- 字段有默认值时
- 字段类型为
Optional
时
代码
from pydantic import BaseModel
from typing import Optional
class Mds(BaseModel):
name: str
age: int = 18
home: str
height: Optional[int] = None
@app.post('/models/')
async def add_model(model:Mds):
return model
接口测试
只携带必选参数
jopa@jopa-PC:~$ curl -X 'POST' 'http://127.0.0.1:8000/models/' -H 'Content-Type: application/json' -d '{"name": "jopa", "age": 18, "home": "hunan"}'
{"name":"jopa","age":18,"home":"hunan","height":null}
携带全部参数
jopa@jopa-PC:~$ curl -X 'POST' 'http://127.0.0.1:8000/models/' -H 'Content-Type: application/json' -d '{"name": "jopa", "age": 18, "home": "hunan", "height": 180}'
{"name":"jopa","age":18,"home":"hunan","height":180}
携带多余参数(多余参数会被忽略)
jopa@jopa-PC:~$ curl -X 'POST' 'http://127.0.0.1:8000/models/' -H 'Content-Type: application/json' -d '{"name": "jopa", "age": 18, "home": "hunan", "height": 180, "ok": "yes"}'
{"name":"jopa","age":18,"home":"hunan","height":180}
缺少必选参数
jopa@jopa-PC:~$ curl -X 'POST' 'http://127.0.0.1:8000/models/' -H 'Content-Type: application/json' -d '{"name": "jopa", "age": 18, "height": 180, "ok": "yes"}'
{"detail":[{"type":"missing","loc":["body","home"],"msg":"Field required","input":{"name":"jopa","age":18,"height":180,"ok":"yes"}}]}
结论
请求结构体的字段,可以多,不可缺少必选的
请求体使用
我们在视图函数内部可以直接使用请求体的属性
代码
from pydantic import BaseModel
from typing import Optional
class Mds(BaseModel):
name: str
age: int = 18
home: str
height: Optional[int]
@app.post('/models/')
async def add_model(Mds:Mds):
ret = {}
if Mds.name:
ret.update({"Name":Mds.name})
if Mds.height:
ret.update({"height":Mds.height})
return ret
接口测试
jopa@jopa-PC:~$ curl -X 'POST' 'http://127.0.0.1:8000/models/' -H 'Content-Type: application/json' -d '{"name": "jopa", "home": "hunan", "height": 180, "ok": "yes"}'
{"Name":"jopa","height":180}