实现 REST API 终结点
现在是有趣的部分了!让我们为图书构建 REST API 终结点!我们将在 routes.py 文件中添加终结点的实现,并在 main.py 文件中加载路由。我们将首先在`routes.py`中初始化一个`APIRouter`对象:
pymongo-fastapi-crud/routes.py
正如您所注意到的,我们从 fastapi 包中导入了 APIRouter。我们将使用此对象来定义 REST API 的终结点。我们还导入了之前定义的`Book`和`BookUpdate`模型。
帖子/图书
我们将实现的第一个终结点是用于创建新图书的`POST /books`终结点。在 router = APIRouter() 行后添加以下内容:
pymongo-fastapi-crud/routes.py
路由是`/`,因为我们会在所有图书终结点前加上`/books`。`response_description`将显示在 API 文档中。`status_code`是请求成功时返回的 HTTP 状态代码。我们使用`Book`模型来验证请求正文中传递的数据以及我们返回的响应。FastAPI 为我们处理验证。在函数正文中,我们使用 PyMongo 的`insert_one()`方法将新图书添加到`books`集合中。我们将使用`find_one()`方法从数据库中检索新创建的图书。您可以在 PyMongo 文档中关于集合级别操作的文章里,阅读有关 insert_one() 和 find_one() 方法的更多信息。
最后,我们返回所创建的图书。
GET /book
接下来,我们将实现`GET /book`终结点,以返回`books`集合中所有文档的列表。将以下内容附加到`routes.py`文件:
pymongo-fastapi-crud/routes.py
对于响应模型,我们使用 List[Book] 类型。这意味着响应将是一个`Book`对象的列表。我们还使用`find()`方法从数据库中检索不超过 100 本图书。要了解有关`limit`和`find()`方法的其他参数的更多信息,请查看专门的 PyMongo 文档页面。
GET /book/{id}
让我们创建另一个`GET`终结点,通过其`id`检索单本图书。将以下内容附加到`routes.py`文件:
pymongo-fastapi-crud/routes.py
在这里,我们将使用`find_one()`方法从数据库中检索单本图书。如果找到这本图书,我们将归还它。如果找不到该图书,我们将引发一个状态码为`404 Not Found`的`HTTPException`,并附上一条适当的消息。
PUT /book/{id}
可以说,我们的 REST API 最重要的终结点是`PUT /book/{id}`终结点。此终结点允许我们更新一本图书。在`routes.py`文件的末尾添加实现代码:
pymongo-fastapi-crud/routes.py
让我们来浏览一下代码。首先,我们正在构建一个用于更新图书的对象。然后,如果`book`对象中有任何字段,我们将使用`update_one()`方法来更新数据库中的图书。请注意,我们使用了`$set`更新操作符,以确保仅更新指定的字段,而不是重写整个文档。
然后,我们检查`update_result`的`modified_count`属性,以确认图书已更新。如果是这种情况,我们使用`find_one()`方法从数据库中检索更新后的图书并将其返回。
如果`book`对象中没有字段,我们将返回现有的图书。但是,如果找不到图书,我们将引发一个状态代码为“404 Not Found”的“HTTPException”。
DELETE /book/{id}
我们将实现的最后一个终结点是`DELETE /book/{id}`终结点,用于通过其`id`删除单本图书。将以下内容附加到`routes.py`文件:
pymongo-fastapi-crud/routes.py
这里唯一值得注意的是,如果图书被删除,我们将返回一个`204 No Content`状态代码。这是一个成功状态代码,表示请求已成功,且响应有效载荷正文中没有内容需要发送。
注册该项
最后,我们需要注册`/book`终结点。打开 main.py 文件,导入`routes`模块,并注册图书路由器。您的 main.py 文件最终版本应该是这样的:
pymongo-fastapi-crud/main.py