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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM