首页 > 解决方案 > Ember.js - 如何处理 API-Platform - 资源链接而不是有效负载中的 Id

问题描述

我将 Emberjs 3.2 与 Api-Platform 一起使用,但遇到了以下问题:

这是我的 API 有效负载:

{
      "id": "/api/articles/0d8cb40c-221b-4c54-9e29-43877093b839",
      "type": "Article",
      "attributes": {
        "_id": "0d8cb40c-221b-4c54-9e29-43877093b839",
        "title": "Article",
        "content": "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>",
        "dateCreated": "2018-07-17T18:20:29+03:00",
        "dateUpdated": "2018-07-17T18:20:29+03:00"
      },
      "relationships": {
        "author": {
          "data": {
            "type": "User",
            "id": "/api/users/b26e0381-6800-4f47-b269-9a92b27ad331"
          }
        }
      }
    }

如您所见,我在有效负载中得到了一个 IRI 而不是 id。

我打开了 api-platform 选项:allow_plain_identifiers: true 但我仍然得到 IRI 而不是相关实体的 ID。

如何使用 EmberData JSONApi 适配器处理这个问题?

我很感激任何想法!

标签: ember.jsapi-platform.com

解决方案


Ember 数据提供了一种有用的序列化方法来处理这种确切的情况:normalizeResponse.

您可以使用创建序列化程序ember generate serializer <modelName>(如果所有模型都需要此模式,您可以创建一个application序列化程序或从基本序列化程序继承。可能您的一个或所有模型都需要这个。

Ember 指南为此提供了确切的解决方案:https ://guides.emberjs.com/release/models/customizing-serializers/

在您的示例中,您可以执行以下操作:

export default DS.JSONAPISerializer.extend({
  normalizeResponse(store, primaryModelClass, payload, id, requestType) {
    payload.data.id = payload.data.attributes._id;
    delete payload.data.attributes._id;

    return this._super(...arguments);
  },
});

推荐阅读