PHP之间的差异;s与AngularJS客户端的$_POST和$_GET


Differences between PHP's $_POST and $_GET with AngularJS client side

我试图将JSON传递给AngularJS中的PHP脚本,如下所示:

var testObj = {
  answers : {
    aa : 2,
    ab : 3
  }
};
var userAnswers = angular.toJson(testObj.answers);
$http.post("ajax/testAddObject.php?answers=" + userAnswers).
success(function(data){
    console.log("Result: ", data);
});

在PHP方面,我做了以下工作:

//... new PDO connection to DB
$answers = $_POST['answers'];
//some more stuff

$answers变量始终为空。但后来,几乎是随机的,我看到了这个问题,答案是:

Content-Type: application/json在标头中传递时,$_POST将为空

而且,尽管我的代码与问题中的代码不完全一样,但我在PHP代码中将$_POST[...]更改为$_GET[...],它成功了问题是,为什么?彼此之间有什么区别?因为,从我所看到的,似乎没有太大的区别。。。

$http.post("ajax/testAddObject.php?answers=" + userAnswers).

在这里,您将answers作为查询参数(GET(发送到testAddObject.php,而不是发布它们(POST(-请注意testAddObject.php末尾的?参数-

$_GET数据作为URL中的参数传递$_POST不是。

$_POST使用HTTP请求主体中的数据填充,如果该数据是使用多部分或url编码格式之一进行格式化的。

CCD_ 12由来自URL的查询字符串部分的数据填充。

即使请求不是GET请求,也会填充$_GET。它只关心它是否在查询字符串中。


既然在评论中提到了。$_REQUEST包含来自$_POST的数据来自$_GET以及来自$_COOKIES的数据。通常最好避免这样做,因为它可能会让你对来自你意想不到的地方的数据感到惊讶。

我深入研究了这个问题,发现这篇文章实际上解释了这是AngularJS的"特性"。

默认情况下,angular.js以json格式发送所有数据。因此,如果对PHP代码执行POST请求,则不会填充$_POST超全局。

虽然我的代码不是完全正确的,但如果我将客户端更改为:

$http.post("ajax/testAddObject.php?", {answers : userAnswers}) //...

并相应地更改PHP,$_POST[...]仍然不返回任何内容,这在现在是有意义的。

根据同一篇文章,有两种解决方案,一种在客户端,另一种在服务器端

在服务器上,您可以解析输入,然后解码json:中的数据

$data = file_get_contents("php://input");
$postData = json_decode($data);`

在客户端,数据可以按照PHP期望的方式发送:

$http({
    url:url
    data : $.param(data),
    method : 'POST',
    headers : {'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8'}
}).success(callback);