2017-02-17 110 views
1

在我的本地环境中,我使用了PHP7,并且我为AngularJS应用程序开发了一个Restful API。我需要做一个GET请求API和传递一个数组作为参数,所以我做到了:将数组作为参数传递给PHP使用AngularJS的Restful Api

$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 
) 

它“undestands”的[]信号作为其HTML代码(%5B和%5D),只得到所述阵列的最后一个元件和解释为黎民变量。

我需要如何在本地环境中读取服务器中的参数?

回答

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' 
    } 
})