新年快樂,今天主要是嘮嘮如何傳請求體
當需要給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
類並繼承父類BaseModel
,name
、money
和description
就是聲明的字段,主要是用於數據傳輸。而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
}
}
]
}
這個是因為我們聲明的字段中,有兩個是必傳參數name
和money
,但是在請求時只傳了name
,才引起的異常錯誤信息。
請求體-多個參數
這里的多個參數指的是傳多個請求體,還有就是結合Path
和Query
等混合參數使用。
首先是混合路徑參數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.name
、items.money
、items.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(…)
是單獨定義一個單個的且必傳的請求體,和items
、user
一個層級。
啟動服務后開始請求接口:
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