13 FastAPI 请求体与响应之请求体的处理

在上一篇文章中,我们探讨了如何使用路径参数来处理请求。在本篇文章中,我们将深入了解如何处理请求体,尤其是如何定义和解析 request body。请求体对于接收复杂数据(例如 JSON 文件、表单数据等)至关重要。我们将通过示例来说明如何在 FastAPI 中使用请求体。

什么是请求体?

请求体是 HTTP 请求中的一部分,通常用于向服务器发送数据。与路径参数和查询参数不同,请求体可以携带更复杂的数据结构,如 JSON 对象、XML 或表单字段。

在 FastAPI 中,我们通常使用 Pydantic 模型来定义请求体数据的结构,这不仅使得数据验证更加简单,而且提供了清晰的文档。

定义 Pydantic 模型

Pydantic 是一个数据验证和设置管理的库,它与 FastAPI 紧密集成。我们首先需要定义一个模型来描述我们的请求体。以下是一个示例模型:

1
2
3
4
5
6
from pydantic import BaseModel

class Item(BaseModel):
id: int
name: str
price: float

在上面的例子中,Item 模型包括三个字段:id(整数)、name(字符串)和 price(浮点数)。使用 Pydantic 后,FastAPI 可以为我们自动进行数据验证。

创建接收请求体的路由

接下来,我们将在 FastAPI 应用中创建一个路由,以接收该模型作为请求体。以下是实现此功能的代码示例:

1
2
3
4
5
6
7
8
from fastapi import FastAPI
from typing import List

app = FastAPI()

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

在此代码中,使用了 @app.post("/items/") 装饰器来定义一个新的 POST 路由。参数 item: Item 是该路由的请求体类型,FastAPI 会自动解析请求体并将其转换为 Item 类型。

测试请求体

我们可以使用 curl 或 Postman 等工具来测试此接口。以下是使用 curl 测试的示例命令:

1
curl -X POST "http://127.0.0.1:8000/items/" -H "Content-Type: application/json" -d '{"id": 1, "name": "Apple", "price": 0.5}'

如果发送的请求体符合 Item 模型的定义,响应将返回相同的数据:

1
2
3
4
5
{
"id": 1,
"name": "Apple",
"price": 0.5
}

多个请求体参数

FastAPI 还支持接收多个请求体参数。可以通过List来处理多个相同类型的请求体。例如,如果我们希望一次创建多个 Item,可以做如下修改:

1
2
3
@app.post("/items/bulk", response_model=List[Item])
async def create_items(items: List[Item]):
return items

测试 bulk 路由的请求体可以如下进行:

1
curl -X POST "http://127.0.0.1:8000/items/bulk" -H "Content-Type: application/json" -d '[{"id": 1, "name": "Apple", "price": 0.5}, {"id": 2, "name": "Banana", "price": 0.3}]'

响应将返回传递的所有项:

1
2
3
4
5
6
7
8
9
10
11
12
[
{
"id": 1,
"name": "Apple",
"price": 0.5
},
{
"id": 2,
"name": "Banana",
"price": 0.3
}
]

总结

在本篇文章中,我们详细探讨了如何在 FastAPI 中处理请求体,定义了 Pydantic 模型,并通过示例展示了如何接收和返回请求体的内容。这为后续文章提供了必要的基础,使我们能更好地理解如何处理响应。

在下一篇文章中,我们将探讨响应之响应的返回格式,包括如何设置响应模型、返回状态码等内容。希望您能继续关注这一系列教程!

13 FastAPI 请求体与响应之请求体的处理

https://zglg.work/python-fastapi-zero/13/

作者

IT教程网(郭震)

发布于

2024-08-17

更新于

2024-08-18

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论