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
类并继承父类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