创建要从 Flickr API 拉取的 Ember 数据适配器



我正在构建一个需要使用Flickr API提取照片信息的Ember App。 我想就如何编写适配器将此信息提取到我的 Ember 应用程序中提供一些建议。 我对 Flickr API 的调用返回了以下形式的 JSON:

{
"photos": {
    "page": 1,
    "pages": 2,
    "perpage": 100,
    "total": "123",
    "photo": [
        {
            "id": "1234567890",
            "owner": "1234567@123",
            "secret": "1234567890",
            "server": "1111",
            "farm": 1,
            "title": "Some Title",
            "ispublic": 1,
            "isfriend": 0,
            "isfamily": 0
        },...
        ]
    },
 "stat": "ok"
}

根据此响应的格式,我确定我不能使用 JSONAPIAdapter,必须使用 RESTAdapter。 我真正感兴趣的回应中唯一部分是照片阵列。 响应的这一部分似乎也已正确格式化以适应 Ember 数据模型,因为它为主键提供了 ID。 我花了很多时间浏览文档以找到解决此问题的方法,但我仍然对这些适配器和序列化程序的工作方式感到非常困惑。 我需要采取哪些步骤来自定义适配器以将此数据正确提取到照片模型中? 提前谢谢你。

这是一本关于这个主题的好书:David Tang 的 Ember Data in the Wild: Getting Ember Data to Work with Your API,还有这篇优秀的博客文章:Fit Any Backend Into Ember with Custom Adapters & Serializers from Ember Igniter。

https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key={api-key}&tags=flower&per_page=3&format=json

会提出:

{
  photos: {
    page: 1,
    pages: 71281,
    perpage: 3,
    total: "213841",
    photo: [
      {
        id: "35314184896",
        owner: "33472394@N00",
        secret: "e02e15d7c3",
        server: "4198",
        farm: 5,
        title: "Bird's-foot Trefoil",
        ispublic: 1,
        isfriend: 0,
        isfamily: 0
      },
    ]
  },
  stat: "ok"
}

因此,您需要为"照片"+适配器创建一个模型来获取数据,然后在序列化程序中使用normalizeResponse()或某种方法组合来修改/重新格式化数据,以将其放入数组中。照片的网址到底在哪里?

也看看大卫的这篇文章: 余烬数据和自定义 API - 5 种常见的序列化程序自定义

这是一个艰难的问题。我只是想做一个叽叽喳喳,但没有适配器。祝你好运!

已解决:

数据使用 normalizeResponse(( 序列化为照片模型。 照片模型镜像上面发布的示例 JSON 中的照片字段。

import DS from 'ember-data';
    // app/serializers/photo.js
    export default DS.RESTSerializer.extend({
      normalizeResponse(store, primaryModelClass, payload, id, requestType) {
        payload = {
          photo: payload.photos.photo
        };
        return this._super(store, primaryModelClass, payload, id, requestType);
      }
    });

我的适配器定义如下:

import DS from 'ember-data';
// app/adapters/photo.js
export default DS.RESTAdapter.extend({
  host: 'https://api.flickr.com/services/rest/?method=flickr.people.getPublicPhotos&api_key=<YOUR_KEY_HERE>&user_id=<YOUR_USER_ID_HERE>&format=json&nojsoncallback=?',
  namespace: 'api'
});

感谢警长分享上面的大量资源。

最新更新