如何使用(jQuery样式)嵌套对象序列化GET参数

时间:2016-11-14 18:11:26

标签: jquery ruby-on-rails angularjs angular-http

我需要通过Angular发送以下get请求。根据此请求,我有一个rails服务器,它接收param并返回JSON数据。

需要GET请求:

  

http://localhost:8080/clients.json?c[year][]=&c[year][]=2016&c[year][]=2015

到目前为止

Angular代码:

    $http({method: 'GET', url: '/clients.json', params:{???}.success(function(data){
        //angular does something    
    });

我如何在Angular中发送年份参数,以便服务器识别c [year] [2016] - 嵌套数组格式?基本上,我怎么能正确地取代???在提供的代码中?

2 个答案:

答案 0 :(得分:2)

使用$httpParamSerializerJQLike

var myUrl = '/clients.json'
var myParams = {c: {year: ["2015", "2016"]}};

$http({
  url: myUrl,
  method: 'GET',
  params: myParams,
  paramSerializer: '$httpParamSerializerJQLike'
});

$httpParamSerializerJQLike服务是遵循jQuery的param()方法逻辑的替代$ http params序列化程序。

JSON:   {"c":{"year":[2014,2015]}}
Encode: c%5Byear%5D%5B%5D=2014&c%5Byear%5D%5B%5D=2015
Decode: c[year][]=2014&c[year][]=2015

DEMO on JSFiddle

  

出于某种原因,我跑:

var myParams = {c: {year: ["","2015","2016"]}};
var myParamsString = JSON.stringify(myParams);
var myParamsSerial = $httpParamSerializerJQLike(myParamsSerial);
     

myParamsSerial显示为空白。有什么想法吗?

不要对对象进行字符串化:

 var myParams = {c: {year: ["","2015","2016"]}};
 //DONT stringify
 //var myParamsString = JSON.stringify(myParams);
 //var myParamsSerial = $httpParamSerializerJQLike(myParamsSerial);
 //USE directly
 var myParamsSerial = $httpParamSerializerJQLike(myParams);

params序列化程序序列化JavaScript对象,而不是JSON字符串。

答案 1 :(得分:0)

您希望您的服务器在您的GET参数中收到类似的内容:

{c: {year: ["2015", "2016"]}}

因此,您从Angular应用程序发送的数据应该完全采用这种格式。因此,这应该有效:

$http({method: 'GET', url: '/clients.json', params: {c: {year: ['2015', '2016']}}.success(function(data){
    //angular does something    
});