我试图将一组嵌套的查询参数传递给我的Laravel 5.1 API。我正在使用$httpParamSerializer(params)
序列化对象,这似乎正确地执行了GET
看起来像:
GET "http://my-api.localhost/1.0/categories?category=Anatomy&category=Consent+Forms"
然而,当我从Laravel返回$request
时,它只显示其中一个属性:
Object {category: "Consent Forms"}
为什么会这样?
Angular Frontend:
var filters = {
category : ['Anatomy', 'Consent Forms']
};
Category.getCategories(filters).then(function(res) {
// Object {category: "Consent Forms"}
console.log('CATEGORIES', res.data);
Angular HTTP Request:
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;
答案 0 :(得分:1)
问题是$httpParamSerializer
的默认行为是在数组的每个值的url中输出相同的键,PHP在最后设置的基础上处理,因此只设置了最后一个键值par。
{'foo': ['bar', 'baz']} results in foo=bar&foo=baz (repeated key for each array element)
您可以使用$httpParamSerializerJQLike
服务来处理受jQuery .param()
启发的网址编码数据流程。
使用$httpParamSerializerJQLike
参数:
category : ['Anatomy', 'Consent Forms']
将成为:
?category[]=Anatomy&category[]=Consent+Forms
要使用$httpParamSerializerJQLike
,您需要将其注入Controller中。例如
.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
});
},