5

我的 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

如何获得数字?响应来自服务器的哈希是可行的,但我试图弄清楚如何使它与数组一起工作。

4

4 回答 4

8

一个资源“类”对象,具有用于默认资源操作集的方法,可选地 > 使用 custom 扩展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 安全最佳实践? 什么是“顶级 JSON 数组”,为什么它们存在安全风险?

于 2013-04-30T05:41:58.820 回答
7

这个未解决的问题 (#4314)有很好的信息说明为什么数字(和其他原始数据类型,如字符串)不能被$resource.

据我了解, $resource 需要处理对象,以便它可以附加它的方法(get, query,post等...)。如果您要做的只是读取数组并且永远不需要“更新”它,他们建议使用直接 up $http

希望这有助于澄清问题,并为这个问题的未来读者指明正确的方向,以获得通过 REST api 处理数组的最佳实践。

于 2014-03-21T07:03:47.523 回答
5

您可以使用 isArray: true; 向资源添加自定义操作 (资源文档

return $resource('test', {}, {
  getArray: { method: 'GET', isArray: true } 
};

那我相信你必须用美元符号来称呼它myData.$getArray

于 2013-04-30T05:30:54.670 回答
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

Angular ngResource 文档

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]);
于 2013-04-30T05:33:52.737 回答