9

我正在尝试将一个数组从 AngularJS 传递给我们的 API。但是,在发送时,参数会重复而不是作为数组发送。这是我的代码:

    angular.module('sigApp.services', ['ngResource']).
    // Fetch cases from server
    service('caseFetcher', ['$resource', function($resource) {
        this.getCases = function(params) {
            console.log('params: ',params);
            return $resource('/v1/cases/', params);
        };
    }]);

这是生成的 URL(缩写):/v1/cases?status=OPEN&status=HELD

这是我想要的 URL: /v1/cases?status%5B0%5D=OPEN&status%5B1%5D=HELD (又名 ?status[0]=OPEN&status 1 =HELD )

这是上面代码中记录的对象的屏幕截图: 在此处输入图像描述

我已经尝试过最新版本的 angularjs (1.2rc1) 并且还尝试了 Restangular 插件。无论我尝试什么,我都会多次传递参数,而不是数组格式。我们的 API 不能处理具有相同键的多个值。

有任何想法吗?

编辑:当另一个问题( AngularJS:ngResource 和对象数组作为 URL 的参数)根本不是这样时,有几个人将其标记为重复。另一个问题涉及通过 POST 发送一个数组,我正在尝试执行一个 GET 请求(默认情况下设置为 isArray: true),并且我只想将一个参数作为数组传递,这个答案似乎没有帮我。那么有人可以帮忙吗?

更新我在下面回答了我自己的问题,但正如评论所言,我正在为遇到此问题的任何人提供更多信息。我们在后端使用 Play Framework 2.1。我无法生成我最初在上面发布的编号数组,但能够让它工作只是一个非索引数组,所以这是生成的最终工作的 URL:

/v1/cases?status%5B%5D=OPEN&status%5B%5D=HELD(又名 ?status[]=OPEN&status[]=HELD)

希望这对其他人有帮助

4

3 回答 3

18

我通过更改传递给 $resource 的参数的设置方式解决了我自己的问题。代替:

$scope.params.status = ['OPEN','HELD'];

我用了:

$scope.params["status[]"] = ['OPEN','HELD'];

这使我可以根据需要检索服务器上的值。

于 2013-08-19T20:10:27.973 回答
0

我在这里为这个创建了一个plunkr

你是对的,资源服务不会做你想做的事..至少我做不到。我能够让它工作的方法是利用 $http 服务并使用附加到参数“状态”的逗号分隔值来构建我的查询字符串。结果是以下形式的 URI:

http://run.plnkr.co/someUrl?status=一,二,三

在您的 API 方面,您可以将逗号分隔的参数解释为具有索引的元素。

代码中的基本构建是这样的:

var statusValues = ["One", "Two", "Three"];
var queryParams = "status=";
for (var i=0;i<statusValues.length;i++){
  queryParams += statusValues[i];
  if (i != statusValues.length-1){
    queryParams += ",";
  }
}
$http.get('/someUrl?' + queryParams).success(successCallback);
于 2013-08-19T17:44:53.643 回答
0

出于某种原因,将变量设置为“数组”样式名称的解决方案对我不起作用。这个问题可能是 AngularJS 1.0.8。对于那些不能前滚的人来说,这里有一个将对象分解为参数的小功能。

function queryBuilder(object){
    var key;
    var queryString = '?';
    var count=0;
    for (key in object){
        if(count !== 0){
            queryString+='&';
        }
        if(object[key] instanceof Array){
            var lengthOfObj =object[key].length;
            for(var i=0;i<lengthOfObj;i++){
                if(count !== 0){
                    queryString+='&';
                }
                queryString += key +'='+object[key][i];
                count++;
            }
        }else{
            queryString += key +'='+object[key];
        }
        count++;
    } 
    return queryString;
}   

用法:

var baseInfo = {
    someGetVar:someGetArray
}
var queryString = queryBuilder(baseInfo);
var url = 'someURL';

$http({method:'GET',url:url+queryString}).success(function(data){
    //success state
}).error(function(data){
    //Error state
))
于 2014-11-03T16:32:10.790 回答