第七部分 – 序列化器
Mirage 還有一個序列化器層,可以幫助您模擬通常應用於 API 的轉換,例如您的 JSON 物件鍵是否為 camelCased 或 snake_cased,或者相關資料如何包含在回應中。
我們的提醒應用程式還有另一個我們尚未見過的功能,因為我們目前為止模擬回應的方式。「全部」螢幕上的提醒實際上應該顯示它們所屬的清單(如果有的話)。
為了使這個功能運作,我們的應用程式期望 GET 請求到 /api/reminders
返回每個提醒的清單,並將其嵌入其中,如下所示
// 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,每次在路由處理程式的回應中遇到提醒模型時,都應該包含其相關的清單(如果有的話)。
其次,embed: true
告訴 Mirage *如何*序列化包含的資源。預設情況下,它們是側載的,但此 API 期望它們被嵌入,如上面的 JSON 片段所示。
新增這些變更後,如果您在「全部」頁面上重新整理您的應用程式,您應該會看到屬於清單的提醒旁邊有清單標籤
嘗試使用 UI 為特定清單建立更多提醒,然後返回「全部」。標籤應該會顯示您的新資料。
重點回顧
- Mirage 的序列化器層可用於轉換您的 JSON 酬載
- 一些常見的序列化器問題是更改 JSON 酬載的形狀(例如,是否在根中包含鍵)、複合字格式化(例如,camelCase 與 snake_case)的約定,以及何時以及如何包含相關資料