$ http.get不能处理只有一个元素的数组。如何指定参数类型?

时间:2016-02-08 15:22:31

标签: angularjs ajax http

我使用Angular的$http.get()方法查询我的API:

var arr = ['foo','bar'];
return $http.get("api/foo", {
  params: { sampleids: arr}
});

这会导致对/api/foo?sampleids=115&sampleids=116的请求正常工作。但是,如果我将数组的大小减小为单个元素,它将变为/api/foo?sampleids=115express (node.js) fails to interpret as an array

如果Angular将查询发送为/api/foo?sampleids[]=115,则应该可以正常工作。我有什么方法可以告诉它这样做吗?

2 个答案:

答案 0 :(得分:1)

您可以在请求配置中使用paramSerializer属性来自定义参数对象如何转换为字符串。

return $http.get("api/foo", {
  params: { myArray: arr},
  paramSerializer: function (params) {
      // Return a string...
  }
});

如果您不确定如何序列化对象,可以在此处查看默认实现:https://github.com/angular/angular.js/blob/master/src/ng/http.js#L27

此外,如果您提供字符串而不是函数,它将查找具有该名称的服务 - 如果您想重用它,这可能会有所帮助。默认情况下提供了$httpParamSerializerJQLike服务,它以与jQuery' param()函数相同的格式对它们进行序列化。

答案 1 :(得分:0)

如何最好地将数组实现为参数似乎存在一些不确定性。
您可以尝试使用JSON.stringify

var arr = ['foo','bar'];
$http(
  method: 'GET',
  url: 'api/foo',
  params: {
    arr: JSON.stringify(arr) 
})

或者简单地说:

var arr = ['foo','bar'];
$http(
  method: 'GET',
  url: 'api/foo',
  params: {
    "arr[]": arr
})

您可能会发现此SO article有用