我试图将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);