从非默认 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
获取所有帖子时使用此方法。
希望对您有所帮助!
我想使用 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
获取所有帖子时使用此方法。
希望对您有所帮助!