在我的本地环境中,我正在使用PHP7,我为AngularJS应用程序开发了Restful API。我需要向Api做一个get请求并传递一个数组作为参数,所以我做到了:
$http.get("/Api/MyUrl.php", {
params: {
"Names[]": ["Foo", "Bar"]
}
})
.then(function(response){ //fires in success
console.log(response.data);
}, function(response){ //fires in error
console.log(response.statusText);
});
在MyUrl.php文件中,我在屏幕上打印了如下参数:
<?php
print_r($_GET);
?>
当它被执行时,我想象的就是在浏览器控制台上打印出来的:
Array
(
[Names] => Array
(
[0] => Foo
[1] => Bar
)
)
直到这里没有问题。但是,当我在服务器中上传应用程序时,它只支持5.6 PHP版本(我不知道它是否相关,但我认为是这样),带有数组的参数是由PHP以另一种方式获取的,以及打印在控制台上的是:
Array
(
[Names%5B%5D] => Bar
)
它将[]信号“取消”为HTML代码(%5B和%5D),只获取数组的最后一个元素并将其解释为一个commom变量。
我需要做什么才能像在本地环境中那样读取服务器中的参数?
答案 0 :(得分:1)
好问题。我建议您在angularjs项目中查看this old issue,其中包含:
如何将数组序列化为查询字符串没有特别的标准。不同的后端需要不同的格式。这种当前的方法(在1.1.x中)是专门选择的,因为它允许开发人员最灵活。
你将params传递给$http.get()
的方式似乎适用于php7.0,因为php7.0可能足够聪明,可以推断出括号被传递。但事实是,角度代码中的查询字符串没有经过正确的URI编码,因此无法对服务器进行编码。
有趣的是,有一个类似的问题已经被报道here答案引用了jQuery中具有相同行为的文档:
由于没有普遍认可的param字符串规范,因此无法使用此方法对所有支持此类输入的语言进行理想编码的方式对复杂数据结构进行编码。使用JSON格式代替编码复杂数据。
解决方案是什么?
首先,您可以试试URI-encoding你的参数。
另一种解决方案是将您的查询作为json编码数据传递:
$http.get("/Api/MyUrl.php", {
params: {
"data": JSON.stringify({'names': {'Foo', 'Bar'}})
}
})
和json_decode($_GET['data'])
可在后端访问您的参数。
最后,您可以利用AngularJS的paramSerializer
来定义您自己的序列化程序,并按照惯例传递您的参数。
在这种特殊情况下,paramSerializerJQLike
将非常有用:
$http.get("/Api/MyUrl.php", {
params: {
"Names[]": ["Foo", "Bar"]
}
paramSerializer: '$httpParamSerializerJQLike'
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
})