FastAPI(8)- 请求体 Request Body (上)

简介: FastAPI(8)- 请求体 Request Body (上)

前言


  • 接口传参方式之一:通过发送请求体(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

 

正确传参的请求结果

image.png


查看请求头

image.png

是 json 格式,符合预期

 

重点

  • 用 postman 发起请求的话,一定要选 JSON 格式哦
  • 因为接收的是 dict,所以 FastAPI 会自动将 JSON 字符串转换为 dict
  • 这种场景下,虽然查询参数叫 item,但请求体的字段名可以随意取,字段数量也可以任意个

 

错误传参的请求结果

image.png

选了 text 之后,因为不是 JSON 字符串,FastAPI 无法正确解析请求体为 dict,所以会报类型错误的提示

 

查看请求头

image.png


类型是 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 会对每一个键值对都做数据校验,校验失败会有友好的错误提示

 

正确传参的请求结果

image.png

image.png



相关文章
|
4天前
|
JSON API 数据安全/隐私保护
如何使用Fastapi上传文件?先从请求体数据讲起
如何使用Fastapi上传文件?先从请求体数据讲起
|
4天前
|
IDE 测试技术 开发工具
FastAPI 并发请求解析:提高性能的重要特性
在当今的数字化世界中,网络用户对于高速响应和持续连接的诉求日益显著。这促使了基于 Python 构建的 FastAPI 框架受到广泛关注,它不仅现代化且效率极高,而且简化了并行请求的处理。本篇文章旨在探讨 FastAPI 如何处理这类请求,并对应用实例进行实际编码展示。
FastAPI(54)- 详解 Request 请求对象(上)
FastAPI(54)- 详解 Request 请求对象(上)
538 0
|
存储 SQL 前端开发
FastAPI第三天---文件请求
FastAPI第三天---文件请求
165 0
FastAPI第三天---文件请求
|
前端开发 中间件 测试技术
FastApi的请求拦截
FastApi的请求拦截
689 0
|
XML JSON JavaScript
FastApi-06-请求体-3
FastApi-06-请求体-3
124 0
|
存储 Python
FastAPI(54)- 详解 Request 请求对象(下)
FastAPI(54)- 详解 Request 请求对象(下)
471 0
FastAPI(54)- 详解 Request 请求对象(下)
FastAPI(15)- 声明请求示例数据(下)
FastAPI(15)- 声明请求示例数据(下)
188 0
FastAPI(15)- 声明请求示例数据(下)