第七部分 – 序列化器

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 片段所示。

新增這些變更後,如果您在「全部」頁面上重新整理您的應用程式,您應該會看到屬於清單的提醒旁邊有清單標籤

Failing request

嘗試使用 UI 為特定清單建立更多提醒,然後返回「全部」。標籤應該會顯示您的新資料。

重點回顧

  • Mirage 的序列化器層可用於轉換您的 JSON 酬載
  • 一些常見的序列化器問題是更改 JSON 酬載的形狀(例如,是否在根中包含鍵)、複合字格式化(例如,camelCase 與 snake_case)的約定,以及何時以及如何包含相關資料