在本章节教程中,我将介绍我们在实现 REST API 时应遵循的一些**实践,和开发人员常犯的一些错误以及如何避免这些错误。
- Spring Boot REST API **实践 - 第一章:实现 Get Collection API(本文)
- Spring Boot REST API **实践 - 第二章:实现 Create 和 Update API
- Spring Boot REST API **实践 - 第三章:实现 FindById 和 DeleteById API
- Spring Boot REST API **实践 - 第四章:REST API 的异常处理
在第一章中,我们将实现第一个 API 端点,即获取资源列表。我们将了解开发人员常犯的一些错误以及如何避免这些错误。
首先,访问 https://start.springboot.io,选择 、、、、 和 starter,创建一个 Spring Boot 应用程序。
我们的示例应用及其简单,但却是按真实应用程序中遵循的相同实践进行操作。
本教程中的示例代码,可以在 GitHub 中找到。
我们要构建的 REST API 是用来管理书签(bookmark)的。书签(bookmark)包含 、、、 和 属性。
创建 JPA 实体 ,如下:
请注意,该实体类不是 的,因此其可见性仅限于 包。
我们将使用 Flyway 进行数据库迁移。要了解有关 Flyway 的更多信息,请查阅《Spring Boot Flyway 数据库迁移教程》。
在 目录下创建以下迁移脚本。
:
创建 接口,如下:
创建 ,它是一个带事务的 service,暴露在 包之外。
注意事项:
要把我们的组件设计成一个高内聚的组件,隐藏内部执行细节,以下几点非常重要:
- 注意, 实体和 不是 的。它们是包私有范围的类/接口。它们只应由 使用,并对 之外的包不可见。
- 是一个带事务的 service 层组件,将被 web 层或其他 service 组件使用。 的注解为 ,这意味着所有 方法都是事务性的,只允许对数据库进行只读操作。对于需要执行插入/更新/删除数据库操作的方法,我们可以通过在方法上添加 注解来覆盖这种只读行为。
Spring Boot 3.1.0 引入了对 Testcontainers 的支持,我们可以用它来编写集成测试和本地开发。
在生成应用程序时,我们选择了 和 starter。因此,生成的应用程序将在 目录下有一个 文件,内容如下:
我们可以通过在 IDE 运行 或在命令行中运行 ,在本地启动应用程序。
现在,我们已经完成了所有基本代码的设置,可以开始实现 API 端点了。让我们从实现获取所有书签的 API 端点开始。
我们可以按如下方式实现 API 端点:
先是 serivce,:
然后,创建 ,实现 API 端点,如下::
你可能会在很多教程和示例中看到这种实现方式,但这是一种不好的实现方式。
这种实现方式存在问题:
- 我们直接将数据库实体作为 REST API 响应暴露,在大多数情况下这是一种不好的做法。如果我们必须对实体进行任何更改,那么 API 响应格式也会随之改变,这可能并不可取。因此,我们应该创建一个 DTO,只公开 API 所需的字段。
- 如果我们获取数据只是为了返回给客户端,那么最好使用 DTO 投影,而不是加载实体。
- 方法将加载表中的所有记录,如果记录数以百万计,则可能导致 异常。如果表中的新数据是不断增加的,建议使用分页。
因此,让我们使用分页和 DTO 投影重新实现这个 API。
创建一个 类,表示通用的分页查询结果,如下:
创建 record 如下:
现在,让我们在 中添加一个方法,使用分页和 DTO 投影来检索书签,如下:
创建一个类来封装所有查询参数,如下:
如果将来想给 API 增加过滤和排序功能,使用 这个封装类将非常方便。
现在,更新 如下:
最后,更新 如下:
现在,如果运行应用程序并访问 API 端点,就会得到如下响应:
接下来,为我们的 API 端点编写一个自动化测试。我们将使用 来调用 API 端点,使用 来配置 PostgreSQL 数据库。
我们应始终确保数据库处于已知状态,以便编写可预测的断言。因此,创建 文件,内容如下:
现在,我们可以在测试方法中添加注解 ,以便在运行测试之前执行指定的 SQL 脚本。
接着,编写 API 测试代码,如下:
现在,运行测试,可以看到 启动了一个 PostgreSQL 数据库,并且 Spring Boot 在测试运行时自动配置使用该数据库。
我们将在本系列的《Spring Boot REST API **实践 - 第二章》中了解如何实现创建和更新书签的 API 端点。
在 Spring Boot REST API **实践系列的第一章中,我们学习了如何通过遵循一些**实践(如分页和 DTO 投影)来实现 API 端点,从而返回资源集合。
你可以在此 GitHub 仓库中找到本教程的示例代码。
参考:
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/java-jiao-cheng/6353.html