前言
- 接口传参方式之一:通过发送请求体(Request Body)来传递请求数据
- 在 FastAPI,提倡使用 Pydantic 模型来定义请求体
- 这篇文章会详细讲不使用 Pydantic 和 使用 Pydantic 发送请求体的栗子
注意
- 请求体并不是只有 POST 请求有,只不过 POST 更常见
- 在 PUT、DELETE、PATCH 请求中都可以使用请求体
- 其实,在 GET 请求中也可以用请求体,不过仅适用于非常极端的情况下,而且 Swagger API 并不会显示 GET 请求的请求体
不使用 Pydantic的栗子
from fastapi import FastAPI import uvicorn app = FastAPI() @app.post("/items") async def read_item(item: dict): return {"item": item} if __name__ == "__main__": uvicorn.run(app="6_request:app", host="127.0.0.1", port=8080, reload=True, debug=True)
指定查询参数的类型为 dict
正确传参的请求结果
查看请求头
是 json 格式,符合预期
重点
- 用 postman 发起请求的话,一定要选 JSON 格式哦
- 因为接收的是 dict,所以 FastAPI 会自动将 JSON 字符串转换为 dict
- 这种场景下,虽然查询参数叫 item,但请求体的字段名可以随意取,字段数量也可以任意个
错误传参的请求结果
选了 text 之后,因为不是 JSON 字符串,FastAPI 无法正确解析请求体为 dict,所以会报类型错误的提示
查看请求头
类型是 text
用 Dict 代替 dict 的栗子
Dict 是 typing 模块提供的类,可以指定键值对的数据类型
from typing import Dict from fastapi import FastAPI app = FastAPI() @app.post("/Dict/") # 键为 str,值为 float async def create_index_weights(weights: Dict[str, float]): return weights
使用 Dict 相比直接用 dict 的好处
声明为 Dict[str, float],FastAPI 会对每一个键值对都做数据校验,校验失败会有友好的错误提示
正确传参的请求结果