Request Body


Request Body

当需要从客户端(如浏览器)发送数据到 API 时,可以借助 request body

request body:从客户端发送到 API 的数据

response body:从 API 发送到客户端的数据

API 总是需要发送 response body,但是客户端并不一定需要发送 request body

借助 Pydantic 来声明 request body

  • 通常不用 GET 发送 request body (实际上 GET 好像也是可以发送的)

  • 通常用:POST(最常见),PUTDELETEPATCH 中的一种发送数据

Pydantic example

from fastapi import FastAPI
from pydantic import BaseModel


class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None


app = FastAPI()


@app.post("/items/")
async def create_item(item: Item):
    return item

声明 request body 步骤:

  1. 导入 BaseModel
  2. 定义数据模型并继承于 BaseModel
    • 要注意声明 Python types
    • 和声明查询参数一样,当模型的属性有默认值时,该属性不是必须的,否则是必须的,用 None 声明可选参数
  3. 声明数据模型为参数:
    • 类似路径参数和查询参数一样,将其加入到函数参数中,并声明类型为自定义的数据类型

Results

使用上述的声明,FastAPI 将会:

  • 以 JSON 格式读取 request body
  • 将数据转化为相应的类型(如果需要的话)
  • 验证数据:
    • 如果不合法,将会返回错误信息
  • 以定义的数据类型返回接受的数据,在上述例子中,request body 被转化为 Item 类型:
    • 如果在函数中声明了定义的数据类型,还将获得 IDE 支持
  • 为模型自动生成 JSON 模式定义
  • 这些协议将作为自动生成的 OpenAPI 的协议,并用作文档的自动生成

Automatic docs

自定义模型的 JSON 协议将会作为自动生成 OpenAPI 协议的一部分,并且会通过交互式 API 文档展现

它们也会被用在每个需要path operation的 API 文档上

Editor support

IDE 将支持类型提示和自动补全,以及错误检查

Use the model

在函数中,可以直接访问所有数据模型的属性(和正常的访问没有区别)

from fastapi import FastAPI
from pydantic import BaseModel


class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None


app = FastAPI()


@app.post("/items/")
async def create_item(item: Item):
    item_dict = item.dict()
    if item.tax:
        price_with_tax = item.price + item.tax
        item_dict.update({"price_with_tax": price_with_tax})
    return item_dict

Request body + path parameters

可以同时声明路径参数和 request body

FastAPI 能够自动识别函数参数中从路径中得到的路径参数request body 中获得的 Pydantic models

from fastapi import FastAPI
from pydantic import BaseModel


class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None


app = FastAPI()


@app.put("/items/{item_id}")
async def create_item(item_id: int, item: Item):
    return {"item_id": item_id, **item.dict()}

Request body + path + query parameters

可以同时声明路径参数、request body 以及查询参数

FastAPI 能够自动识别它们

from fastapi import FastAPI
from pydantic import BaseModel


class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None


app = FastAPI()


@app.put("/items/{item_id}")
async def create_item(item_id: int, item: Item, q: str = None):
    result = {"item_id": item_id, **item.dict()}
    if q:
        result.update({"q": q})
    return result

函数参数的识别遵循:

  • 如果参数出现在 path 中,则为路径参数
  • 如果参数具有单一的类型,则为查询参数
  • 如果被声明为 Pydantic model,则为 request body

Without Pydantic

可以使用 Body parameters 代替 Pydantic model


文章作者: qiufeng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 qiufeng !
评论
 上一篇
python 函数参数 python 函数参数
可接受任意数量参数的函数使用 * 参数,可以让一个函数接受任意数量的位置参数 def test(arg, *args): pass 在上述例子中,args 是一个由除 arg 以外所有位置参数组成的元组 使用 ** 参数,可以让一个
2020-04-11
下一篇 
Query Parameters Query Parameters
Query Parameters当声明的函数参数不是路径参数的一部分时,它们会被自动的解释为查询参数(可以直观的理解为 URL 中 ? 后面,以 & 分割的键值对) from fastapi import FastAPI app
2020-04-11
  目录