4.FastAPI请求体
4.1请求体(Request Body)
请求体是客户端发送到API的数据。
响应体时API返回给客户端的数据。
在FastAPI中,定义请求体需要使用pydantic模型;不能通过get请求发送请求体。
发送请求体的方法:
-
post
-
put
-
delete
-
patch
4.2创建数据模型
4.2.1定义模型
-
需要使用pydantic中的BaseModel类
-
声明自己的数据模型为一个继承BaseModel的类
代码如下:
from pydantic import BaseModel class Language(BaseModel): language_id: str = None language_name: str description: str = None year: int = 2010 ranking: int = 1
数据类型与默认值的使用规则与请求参数是相同的。如上面的代码中,除language_name外,其他均为可选的。
将上面的代码保存为language.py
4.2.2使用模型作为参数
在路由对应的函数中使用模型作为参数,代码如下:
from fastapi import FastAPI from language import Language app = FastAPI() @app.post(path='/create_language') async def create_language(language: Language): return language
在上面的代码中声明的参数类型为Language,接下来执行如下请求:
curl -H "Content-Type: application/json" -X POST -d "{\"language_name\": \"Python\", \"ranking\":9}" http://127.0.0.1:8000/create_language {"language_id":null,"language_name":"Python","description":null,"year":2010,"ranking":9}
4.3使用请求体的好处
通过定义 pydantic model,FastAPI会进行如下操作:
-
读取请求的正文,读取为JSON类型;
-
转换为相应的Python类型
-
验证数据
4.4同时定义路径参数、查询参数和请求体参数
在FastAPI中,对于路径参数、查询参数和请求体参数的区分规则:
-
路径中存在的参数为路径参数;
-
其他基本类型的参数为查询参数;
-
声明为pydantic模型类型的参数为请求体;
代码如下:
from fastapi import FastAPI from language import Language app = FastAPI() @app.post(path='/create_language/{a}/{b}') async def create_lanuage(language: Language, a: int, b: int, x: int = 2, y: int = 3): return {'language': language, 'added': a + b, 'multiply': x * y}
执行请求:
curl -H "Content-Type: application/json" -X POST -d "{\"language_name\": \"Python\", \"ranking\":9}" http://127.0.0.1:8000/create_language/2/3 { "language": { "language_id":null, "language_name":"Python", "description":null, "year":2010, "ranking":9 }, "added":5, "multiply":6 } C:\Users\Administrator>curl -H "Content-Type: application/json" -X POST -d "{\"language_name\": \"Python\", \"ranking\":9}" http://127.0.0.1:8000/create_language/2/3?"x=5&y=6" { "language":{ "language_id":null, "language_name":"Python", "description":null, "year":2010, "ranking":9 }, "added":5, "multiply":30 }