请求体+路径参数

实际开发中,我们经常会遇到请求体和路径参数同时存在的场景

代码

from pydantic import BaseModel

class Mds(BaseModel):
    name: str
    age: int = 18
    home: str
    height: Optional[str] = None

@app.post('/models/{name}/')
async def add_model(Mds:Mds,name:str):
    ret = {}
    ret.update({"request_name":name})
    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/jopa666/' -d '{"name": "jopa", "home": "hunan", "ok": "yes"}' -H 'Content-Type: application/json'
{"request_name":"jopa666","Name":"jopa"}

请求体 + 路径参数 + 查询参数

代码

jopa@jopa-PC:~$ curl -X 'PUT' 'http://127.0.0.1:8000/models/jopa666' -d '{"name": "jopa", "home": "hunan", "ok": "yes"}' -H 'Content-Type: application/json'
{"Name":"jopa"}
jopa@jopa-PC:~$ curl -X 'PUT' 'http://127.0.0.1:8000/models/jopa666?q=0' -d '{"name": "jopa", "home": "hunan", "ok": "yes"}' -H 'Content-Type: application/json'
{"Name":"jopa"}
jopa@jopa-PC:~$ curl -X 'PUT' 'http://127.0.0.1:8000/models/jopa666?q=1' -d '{"name": "jopa", "home": "hunan", "ok": "yes"}' -H 'Content-Type: application/json'
{"request_name":"jopa666","Name":"jopa"}

如上,FastApi 可以智能的,自动的识别各类型参数,并从正确的位置获取数据

多结构体时的请求体

通常,为了方便结构体定义,我们可能会将不同类型的结构体分别定义在不同的数据模型中。这样,在视图函数的参数中,也将有多个模型参数,那具体怎么使用呢?

代码

class Mds(BaseModel):
    name: str
    age: int = 18
    home: str
    height: Optional[str]

class Mm(BaseModel):
    title: str
    phone: str = 'huawei'

@app.put('/models/{name}')
async def add_model(Mds:Mds,Mm:Mm,name:str,q: Optional[bool] = False):
    ret = {}
    if q:
        ret.update({"request_name":name})
    if Mds.name:
        ret.update({"Name":Mds.name})
    if Mds.height:
        ret.update({"height":Mds.height})
    if Mm.title:
        ret.update({"Title":Mm.title})
    return ret

接口测试

jopa@jopa-PC:~$ curl -X 'PUT' 'http://127.0.0.1:8000/models/jopa666' -d '{"Mds": {"name": "jopa", "home": "hunan", "ok": "yes"},"Mm": {"title": "TES", "phone": "huawei"}}' -H 'Content-Type: application/json'
{"Name":"jopa","Title":"TES"}

如上,当存在 Mds:MdsMm:Mm 两个结构体参数的时候,正确的请求体格式为:{<模型类名>:<模型>}

{
  "Mds": {
    "name": "phyger",
    "home": "xian",
    "ok": "ok"
  },
  "Mm": {
    "title": "TSE",
    "phone": "xiaomi"
  }
}
最后修改:2025 年 06 月 03 日
如果觉得我的文章对你有用,请随意赞赏