何为请求体

顾名思义,请求体就是在请求过程中客户端携带的数据

请求体不是一定要携带的,而且请求体不建议用 GET 请求发送,通常我们会使用 POST 请求发送请求体,当然是用 PUTDELETEPATCH 方式也可以发送请求体

请求体校验

通常,我们在开发的时候,需要用户根据特定的结构体来发起请求,从而防止攻击和过滤用户

FastApi 的数据模型

FastApi 中,我们可以借助 pydanticBaseModel 类来实现请求结构体的定义

代码

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 的可选字段有以下两种场景

  1. 字段有默认值时
  2. 字段类型为 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}
最后修改:2025 年 06 月 03 日
如果觉得我的文章对你有用,请随意赞赏