2016-07-05 59 views
0

我试图将一组嵌套查询参数传递给我的Laravel 5.1 API。我使用$httpParamSerializer(params)序列化对象,这似乎这样做是正确的GET是这样的:当我返回从Laravel的$requestLaravel解析嵌套的序列化查询字符串

GET "http://my-api.localhost/1.0/categories?category=Anatomy&category=Consent+Forms" 

然而,它只显示属性中的一种:

Object {category: "Consent Forms"} 

这是为什么?

角前端:

 var filters = { 
      category : ['Anatomy', 'Consent Forms'] 
     }; 

     Category.getCategories(filters).then(function(res) { 
      // Object {category: "Consent Forms"} 
      console.log('CATEGORIES', res.data); 

角HTTP请求:

 getCategories: function(params) { 
      var qs = $httpParamSerializer(params); 
      return $http({ 
       method: 'GET', 
       url: url + ver + '/categories?' + qs, 
       headers: Auth.getOAuthHeader(), 
       cache: true 
      }); 
     }, 

Laravel:

public function getCategories(Request $request) { 
    $input = $request->all(); 
    return $input; 

回答

1

的问题是$httpParamSerializer的默认行为是输出在同一个密钥数组的每个值的url,PHP在最后设置的基础上处理,只有最后一个关键值e par已设置。

documentation

{'foo': ['bar', 'baz']} results in foo=bar&foo=baz (repeated key for each array element) 

可以使用$httpParamSerializerJQLike服务来处理由jQuery的.param()启发URL编码数据的过程。

随着$httpParamSerializerJQLike的PARAMS:

category : ['Anatomy', 'Consent Forms'] 

将变为:

?category[]=Anatomy&category[]=Consent+Forms 

要使用$httpParamSerializerJQLike你需要在控制器中注入它。例如

.controller('AppCtrl', function($scope, $http, $httpParamSerializer, $httpParamSerializerJQLike) { 

使用它序列数据:

getCategories: function(params) { 
    var qs = $httpParamSerializerJQLike(params); 
    return $http({ 
     method: 'GET', 
     url: url + ver + '/categories?' + qs, 
     headers: Auth.getOAuthHeader(), 
     cache: true 
    }); 
},