我有两种方法可以通过ID获取REST资源:
GET /users/1
GET /users/1,2
第一个返回单个对象,如{id:1,name:"John"}
,而第二个返回类似[{id:1,name:"John"},{id:2,name:"Jill"}]
的数组。
请不要争论这是否是合法的REST;只是接受服务有这个,我需要使用它。
angular的$ resource实际上是从请求方面智能地处理它:
User.get({users:['1','2']})
转换为
GET /users/1,2
但它没有很好地处理好反应。它需要一个单一的对象。如果我将定义更改为isArray:true
,则会在单个请求GET /users/1
如何让它智能地处理两者?
编辑:我做了一些奇怪的黑客攻击,但是更喜欢原生方法: factory('Resource',['$resource','_',function ($resource,_) {
return function(url,params,methods){
var defaults = {
getSingle: {method: 'get', isArray:false},
getMultiple: {method: 'get', isArray:true}
}, resource = $resource(url,params,angular.extend(defaults,methods)), urlParams = {};
_.each(url.split(/\W/), function(param){
if (param && (new RegExp("(^|[^\\\\]):" + param + "\\W").test(url))) {
urlParams[param] = true;
}
});
// do not override if they did
if (!(methods||{}).get) {
resource.get = function (params,success,error) {
// look for multiples
var isMultiple = false;
_.each(params,function (val,key) {
if (key && urlParams[key] && angular.isArray(val)) {
isMultiple = true;
return(false);
}
});
return this[isMultiple?"getMultiple":"getSingle"](params,success,error);
};
}
return(resource);
};
}]).
答案 0 :(得分:4)
通常的惯例是为单个对象创建Resource.get()
方法,为它们的数组创建Resource.query()
方法。
答案 1 :(得分:4)
在尝试向帖子发送PUT请求时,WP-API遇到类似问题。目前,如果一切正常,API返回表示帖子的对象,但如果出现错误(例如授权凭证不匹配),则返回错误数组。所以我收到错误Error: [$resource:badcfg] Error in resource configuration. Expected response to contain an object but got an array
。
我设法通过在自定义操作对象上使用transformResponse属性来找到解决方案。我定义了一个检查响应的函数,然后如果它是一个数组,它将数组转换为一个对象。这似乎工作正常,并且似乎比您在更新中发布的解决方案复杂一点:
var wpPost = $resource(PATH_TO_WORDPRESS_API + 'posts/:id', {},
{
'update': {
method: 'PUT',
params: {id: '@id'},
transformResponse: function(data) {
var response = angular.fromJson(data);
if (response.length) {
// the response is an array, so convert it into an object
var object = {};
for( var i = 0; i < response.length; i ++) {
object[i] = response[i];
}
return object;
} else {
return response;
}
}
}
});