python:Fastapi 请求体-多个参数

新年快乐,今天主要是唠唠如何传请求体

当需要给api发送一些数据时,就需要用到请求体了。

请求体就是客户端给api发送的一些数据,响应体是api发送给客户端的一些数据。

这里就不能使用 GET 操作(HTTP 方法)发送请求体。
要发送数据,你必须使用下列方法之一:POST(较常见)、PUT、DELETE 或 PATCH。

请求体

如何发送,怎么发送,fastapi给提供了专门的方法,fastapi提供了Pydantic来声明请求体:

  • 首先pydantic中的BaseModel
from pydantic import BaseModel
  • 其次创建数据模型、声明字段并定义接口
from pydantic import BaseModel
from typing import Optional


class ItemsApi(BaseModel):

    name: str
    money: float
    description: Optional[str] = None


app = FastAPI()


@app.post("/create/")
def create_data(items: ItemsApi):
    return items

创建ItemsApi类并继承父类BaseModelnamemoneydescription就是声明的字段,主要是用于数据传输。而description是非必传字段。

注释信息:

  • items: ItemsApi就可以调用ItemsApi类中的字段。

启动服务,并进行传参

192:fastapiProject lifeng$ uvicorn body_main:app --reload
INFO:     Will watch for changes in these directories: ['/Users/lifeng/python-projects/python-code/fastapiProject']
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [41993] using statreload
INFO:     Started server process [41995]

启动成功后,利用postman访问接口进行测试:

POST :http://127.0.0.1:8000/items/

传入必传参数,这里的参数格式必须是json格式,因为BaseModel默认识别的json

{
    "name""haha",
    "money"2.7
}

接口返回结果:

{
    "name""haha",
    "money"2.7
}

如果你请求接口,没有传参数则会抛出异常提示错误:

POST :http://127.0.0.1:8000/items/

接口返回结果:

{
    "detail": [
        {
            "loc": [
                "body"
            ],
            "msg""field required",
            "type""value_error.missing"
        }
    ]
}

因为设置了body,所以必须要传,如果不传就会抛出异常错误;你可能还会看到下面一种异常错误信息:

{
    "detail": [
        {
            "loc": [
                "body",
                22
            ],
            "msg""Expecting property name enclosed in double quotes: line 3 column 1 (char 22)",
            "type""value_error.jsondecode",
            "ctx": {
                "msg""Expecting property name enclosed in double quotes",
                "doc""{\n    \"name\": \"haha\",\n}",
                "pos"22,
                "lineno"3,
                "colno"1
            }
        }
    ]
}

这个是因为我们声明的字段中,有两个是必传参数namemoney,但是在请求时只传了name,才引起的异常错误信息。

请求体-多个参数

这里的多个参数指的是传多个请求体,还有就是结合PathQuery等混合参数使用。

首先是混合路径参数Path和查询参数Query :

from fastapi import FastAPI
from pydantic import BaseModel
from typing import Optional
from fastapi import Path, Query


class ItemsApi(BaseModel):
    name: str
    money: float
    description: Optional[str] = None


app = FastAPI()


@app.put("/update/{item_id}")
def update_data(items: ItemsApi, item_id: int = Path(..., ge=0, le=1), q: str = Query(None)):
    results = {
        "data": {
            "list": [
                {
                    "item_id": item_id,
                    "name": items.name,
                    "money": items.money,
                    "description": items.description
                }
            ]
        }
    }

    if q:
        results |= q

    return results

注释信息:

  • update_data函数中的位置参数前面都已经作了解释,在这里不作过多叙述。
  • items.nameitems.moneyitems.description都是因为items继承了ItemsApi之后,可以调用该类中的成员

启动服务后开始请求接口:

PUT :http://127.0.0.1:8000/update/1

传请求参数,不传会报错错误,因为定义了必传参数:

{
    "name""haha",
    "money"2.8
}

请求成功后的返回值:

{
    "data": {
        "list": [
            {
                "item_id"1,
                "name""haha",
                "money"2.8,
                "description"null
            }
        ]
    }
}

其次是传多个请求体 :

from fastapi import FastAPI
from pydantic import BaseModel
from typing import Optional
from fastapi import Body


class Items(BaseModel):
    name: str
    money: float
    description: Optional[str] = None


class Users(BaseModel):
    username: str
    full_name: Optional[str] = None


app = FastAPI()


@app.put("/update/{item_id}")
def update_data(item_id: int, items: Items, users: Users, single: int = Body(...)):
    return {
        "data": {
            "item_id": item_id,
            "items": items,
            "users": users,
            "single": single},
        "errCode"0,
        "errMsg"""
    }

注释信息:

  • single: int = Body(…)是单独定义一个单个的且必传的请求体,和itemsuser一个层级。

启动服务后开始请求接口:

PUT :http://127.0.0.1:8000/update/1

传请求参数,不传会报错错误,因为定义了必传参数:

{
    "items": {
        "name""haha",
        "money"2.8
    },
    "users": {
        "username""jjj",
        "full_name""lalala"
    },
    "single"1
}

请求成功后的返回值:

{
    "data": {
        "item_id"1,
        "items": {
            "name""haha",
            "money"2.8,
            "description"null
        },
        "users": {
            "username""jjj",
            "full_name""lalala"
        },
        "single"1
    },
    "errCode"0,
    "errMsg"""
}

嵌入单个请求体参数

如果你希望它期望一个拥有 item 键并在值中包含模型内容的 JSON,就像在声明额外的请求体参数时所做的那样,则可以使用一个特殊的 Body 参数 embed

from fastapi import FastAPI
from pydantic import BaseModel
from typing import Optional
from fastapi import Body


class Items(BaseModel):
    name: str
    money: float
    description: Optional[str] = None


app = FastAPI()


@app.put("/items/{item_id}")
def update_items(item_id: int, item: Items = Body(..., embed=True)):
    return {
        "data": {
            "item_id": item_id,
            "items": item},
        "errCode"0,
        "errMsg"""
    }

启动服务后开始请求接口:

PUT :http://127.0.0.1:8000/items/1

请求接口后,这里就不能向下面这样传参了:

{
    "name""haha",
    "money"2.8
}

而是要向下面这样传参数,才不会报错:

{
    "item": {
        "name""haha",
        "money"2.8
    }
}

请求成功后的返回值:

{
    "data": {
        "item_id"1,
        "items": {
            "name""haha",
            "money"2.8,
            "description"null
        }
    },
    "errCode"0,
    "errMsg"""
}

今天先聊到这里吧,以上总结或许能帮助到你,或许帮助不到你,但还是希望能帮助到你,如有疑问、歧义,直接私信留言会及时修正发布;非常期待你的一键 3 连【 点赞、收藏、分享 】哟,谢谢!

未完成,待续……

一直在努力,希望你也是!

微信搜索公众号:就用python

posted @ 2022-02-07 22:19  一名小测试  阅读(995)  评论(0编辑  收藏  举报