从非默认 REST API 检索计数(总计)

Retrieve count (total) from non-default REST API

我想使用 Ember 在我的服务器上查询此 URL http://localhost:1337/api/posts/count?category=technology。我像这样使用默认的 RESTAdapter:

export default DS.RESTAdapter.extend({
  coalesceFindRequests: true,
  namespace: 'api',
)};

Post 模型如下所示:

import DS from 'ember-data';

var Post = DS.Model.extend({
  title: DS.attr('string'),
  permalink: DS.attr('string'),
  body: DS.attr('string')
});

export default Post;

如何提出这样的请求?

我认为当您无法控制后端时,至少有两种方法可以实现这一点。否则,您仍然可以使用 RESTful API(请参阅我的答案的最后一部分)。

覆盖 buildURL

第一个是使用现有的 RESTAdapter 功能并且只覆盖 buildURL 方法:

var PostAdapter = DS.RESTAdapter.extend({
  namespace: 'api',

  buildURL: function(type, id, record) {
    var originalUrl = this._super(type, id, record);
    if (this._isCount(type, id, record))  { // _isCount is your custom method
      return originalUrl + '/count';
    }
    return originalUrl;
  }
});

您在 _isCount 方法中的哪个位置决定(例如根据 record 属性)是否是您想要的。然后,您可以使用商店传递参数:

this.store.find('post', {
  category: technology
});

覆盖查找查询

第二种方法是覆盖整个findQuery方法。您可以使用前面提到的 DS.RESTAdapter 或仅使用 DS.Adapter。代码如下所示:

var PostAdapter = DS.Adapter.extend({
  namespace: 'api',

  findQuery: function(store, type, query) {
    // url be built smarter, I left it for readability
    var url = '/api/posts/count';

    return new Ember.RSVP.Promise(function(resolve, reject) {
      Ember.$.getJSON(url, query).then(function(data) {
        Ember.run(null, resolve, data);
      }, function(jqXHR) {
        jqXHR.then = null;
        Ember.run(null, reject, jqXHR);
      });
    });
  },

});

并且您也像前面的示例一样使用商店:

this.store.find('post', {
  category: technology
});

meta

获得'count'

如果您可以完全控制后端,则可以利用 metadata 的力量。

服务器响应将是:

// GET /api/posts/:id
{
  "post": {
    "id": "my-id",
    "title": "My title",
    "permalink": "My permalink",
    "body": "My body"
  },

  "meta": {
    "total": 100
  }
} 

然后您可以从以下位置获取所有元信息:

this.store.metadataFor("post");

同样,您可以在从 /api/posts 获取所有帖子时使用此方法。

希望对您有所帮助!