第 7 部分 - 序列化器
Mirage 还具有一个序列化器层,可以帮助你模拟通常应用于 API 的各种转换,例如你的 JSON 对象键是驼峰式还是蛇形式,或者相关数据如何在响应中包含。
我们的提醒应用程序还有一个功能,我们之前没有看到,因为我们模拟响应的方式。 “全部”屏幕上的提醒实际上应该显示它们所属的列表(如果有)。
为了使这能够正常工作,我们的应用程序期望对 /api/reminders
的 GET 请求返回每个提醒的列表,并将其嵌入其中,如下所示
// GET /api/reminders
{
"reminders": [
{ "id": "1", "text": "Walk the dog" },
{ "id": "2", "text": "Take out the trash" },
{ "id": "3", "text": "Work out" },
{ "id": "4", "text": "Do taxes", "list": { "name": "Home", "id": "1" } },
{ "id": "5", "text": "Visit bank", "list": { "name": "Work", "id": "2" } }
]
}
序列化器利用 Mirage 的数据层来帮助你模拟像这样复杂的 API 响应。 让我们看看如何操作。
我们将导入 RestSerializer
,将其设置为提醒模型的序列化器,并告诉它嵌入任何相关的列表
import {
createServer,
Model,
hasMany,
belongsTo,
RestSerializer,
} from "miragejs"
export default function () {
createServer({
serializers: {
reminder: RestSerializer.extend({
include: ["list"],
embed: true,
}),
},
// rest of server
})
}
这个新的 serializers
键是一个选项,它允许我们在每个模型的基础上定义序列化器。 如果我们想要对所有响应应用一般转换,我们也可以设置一个 application
序列化器。
我们正在使用的 RestSerializer
类是 Mirage 中包含的三个命名序列化器之一,并且是许多 REST API 的良好起点。 还有为类似 Rails 的 API 提供的 ActiveModelSerializer
,以及为遵循 JSON:API 规范的 API 提供的 JSONAPISerializer
。
最后,我们对 RestSerializer 添加了两个自定义项。
首先,include: ['list']
告诉 Mirage 每次它在路由处理程序的响应中遇到 Reminder 模型时,它应该包含其关联的 List(如果有)。
其次,embed: true
告诉 Mirage *如何* 序列化包含的资源。 默认情况下,它们是侧加载的,但这个 API 期望它们被嵌入,如上面的 JSON 代码片段所示。
添加了这些更改后,如果你在 “全部” 页面上刷新你的应用程序,你应该会在属于列表的提醒旁边看到列表标签
尝试使用 UI 为特定列表创建更多提醒,然后返回到 “全部”。 标签应该会显示在你的新数据中。
要点
- Mirage 的序列化器层可以用来转换你的 JSON 负载
- 一些常见的序列化器问题包括更改 JSON 负载的形状(例如,是否在根目录中包含键)、复合词格式化的约定(例如,驼峰式 vs. 蛇形式)以及何时以及如何包含相关数据