我的RESTful API返回一个数组:
GET /test => [1367297123312,1.0,2.0,3.0,100]
我有服务:
(angular
.module('app.services', ['ng', 'ngResource'])
.factory('myData', [
/******/ '$resource',
function ($resource) {
return $resource('test');
}])
);
在我的控制器中,我需要获取数字。我试过了:
(angular
.module('app.controllers', ['ng', 'app.services'])
.controller('tweetsapiContr', [
/******/ '$scope', 'myData',
function ($scope, myData) {
myData.get({}, function (data) {
console.log(data);
};
}
])
);
上面给出了TypeError: Object #<h> has no method 'push'
错误,如果我在服务上使用query
而不是get
,它会返回一个包含$get
等方法的对象数组, $save
等,但调用$get
例如返回undefined
。
如何获取数字?使用来自服务器的哈希响应有效,但我试图弄清楚如何使它适用于数组。
答案 0 :(得分:8)
资源“类”对象,其具有用于默认资源动作集的方法,可选地>使用自定义
actions
进行扩展。默认设置包含以下操作:
{ 'get': {method:'GET'},
'save': {method:'POST'},
'query': {method:'GET', isArray:true},
'remove': {method:'DELETE'},
'delete': {method:'DELETE'} };
所以你有两个选择:
$resource("/url/:someParam", {}, {
getMyArray: {method:"GET", params: {someParam:"hello"}, isArray: true}
});
资源对象有一个query
方法,使用isArray: true
定义,如您在答案顶部所示。
请注意,使用顶级数组响应GET
方法存在安全漏洞,因为可以重新定义数组构造函数。
阅读那些: JSON security best practices? What are "top level JSON arrays" and why are they a security risk?
答案 1 :(得分:7)
This open issue (#4314)提供了很好的信息,说明$resource
无法解析数字(以及其他原始数据类型如字符串)的原因。
根据我的理解,$ resource需要处理对象,以便它可以附加它的方法(get
,query
,post
等...)。如果您要做的只是阅读数组并且永远不需要“更新”它,他们建议您直接使用$http
。
希望有助于清理问题,并将此问题的未来读者指向正确的方向,以便通过REST api处理数组的最佳实践。
答案 2 :(得分:5)
您可以使用isArray:true向资源添加自定义操作; (resource docs)
return $resource('test', {}, {
getArray: { method: 'GET', isArray: true }
};
然后我相信你必须用美元符号myData.$getArray
答案 3 :(得分:2)
您不应该返回JSON数组,因为它们容易受到跨站点攻击。阅读本文了解为什么部分http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx
返回附加到属性的数组的对象。这将减轻潜在的攻击并一次解决您的问题。
{
d: [1,2,3,4,5]
}
myData.get({}, function (data) {
console.log(data.d);
};
您可以重新构建资源的操作,并将操作的isArray属性设置为true
。
var actions = {
'get': {method:'GET', isArray:true},
'save': {method:'POST'},
'query': {method:'GET', isArray:true},
'remove': {method:'DELETE'},
'delete': {method:'DELETE'}
};
$resource(url[, paramDefaults][, actions]);