2

有两种方法可以通过 ID 获取 REST 资源:

GET /users/1
GET /users/1,2

第一个返回单个对象 like{id:1,name:"John"}而第二个返回一个数组 like [{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);
    };
}]).
4

2 回答 2

4

通常的约定是Resource.get()为单个对象创建一个方法,并Resource.query()为它们的数组创建一个方法。

于 2013-09-28T20:16:37.593 回答
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;
                    }
                }
            }
        });
于 2014-01-13T12:26:06.867 回答