我正试图通过ajax发布数据,这是我的信息:
var jsondata =
{"address" : [
{ "id": addid, "streetaddress": streetaddress, "city": city, "state": state, "zipcode": zipcode, "latitude": latitude},
]
};
var jsontosend = JSON.stringify(jsondata, null, 2);
ajax函数:
$.ajax({
type: "POST",
url: "process.php",
contentType: "application/json; charset=utf-8",
dataType: "JSON",
data: jsontosend,
success: function(msg){
alert(msg);
}
});
return false;
alert('Data sent');
}
在php端,当我打印_r($_POST)时,它只显示
array(0) {
}
我在提醒(jsontosend),它完美地向我显示了一切,在firebug中使用post-mothod,它以完美干净的方式显示了所有发送的参数。
它传递任何数据的唯一方法是使用GET方法。
非常感谢任何建议!
编辑:添加来自firebug的POST数据。这是警报功能的警报:
{"address":[{"id":1473294,"streetaddress":"3784 Howard Ave","city":"Washington DC","state":"DC","zipcode":20895,"latitude":39.027820587}]}
这就是firebug在使用POST方法时显示的传递内容:
myData=%7B%0A++++%22address%22%3A+%5B%0A++++++++%7B%0A++++++++++++%22id%22%3A+76076%2C%0A++++++++++++%22streetaddress%22%3A+%223784+Howard+Ave%22%2C%0A++++++++++++%22city%22%3A+%22Washington+DC%22%2C%0A++++++++++++%22state%22%3A+%22DC%22%2C%0A++++++++++++%22zipcode%22%3A+20895%2C%0A++++++++++++%22latitude%22%3A+39.027820587%0A++++++++%7D%0A++++%5D%0A%7D
这是$_POST:的var_dump的响应
array(0) {
}
这是$_POST['myData']的var_dump
NULL
我对您使用contentType属性的方式持怀疑态度。尝试取出contentType。默认内容类型为应用程序/x-www-form-urlencoded(http://api.jquery.com/jQuery.ajax/)。
此外,使用类似于{mydata:jsontosend}的东西作为数据属性。
$.ajax({
type: "POST",
url: "process.php",
//contentType: "application/json; charset=utf-8",
dataType: "JSON",
data: {mydata: jsontosend},
success: function(msg){
alert(msg);
}
});
使用
data:{myData: jsontosend}
它应该在您的请求中发送myData作为参数。
PHP不理解application/json请求(默认情况下)。请参阅以下问题:如何使用curl 将JSON发布到PHP
我发现dkulkarni提供的评论是这里最好的解决方案。有必要直接从输入流中读取,以获得任何复杂度的POST数据。更改$.ajax({contentType: ''})
的值对我不起作用。
为了解决这个问题,我设置了一个控制器方法来回显我发布到服务器的JSON。更改ContentType标头没有任何区别。但在阅读了dkulkarni的评论后,我更改了我的服务器代码:
return $_POST;
到此:
$data = file_get_contents('php://input');
return json_decode($data);
它运行得很好。
正如dkulkarni在他的帖子(1月24日7:53)中所评论的那样,检索用Content-Type application/JSON发送的JSON的唯一方法似乎是直接从输入流中检索它。
我用不同的方法做了很多测试,但当我将ContentType设置为JSON时,PHP中的$_POST总是空的。
我的问题是,我需要将ContentType设置为JSON,因为服务器(我没有访问权限的地方)需要它,否则它会返回不受支持的数据类型。我想他们是直接从输入流中检索的。
为什么我必须在自己的PHP文件中复制它?因为我需要制作一个测试问题的代理,但这不是这个线程的重点。
去掉contentType不是一个好主意。您确实希望以JSON格式发送此数据。关键是要做上面提到的事情,而不是试图用$data=$_POST访问接收端(目标php文件)上的数据,关键是要使用$data=file_get_contents('php://input');
以下是php和knockout.js:场景的整个往返示例
JS(在请求页面上):
function() {
var payload = ko.toJSON({ YOUR KNOCKOUT OBJECT });
jQuery.ajax({
url: 'target.php',
type: "POST",
data: payload,
datatype: "json",
processData: false,
contentType: "application/json; charset=utf-8",
success: function (result) {
alert(result);
}
});
};
然后在target.php(接收请求的页面)中:
$data = file_get_contents('php://input');
$payload_jsonDecoded = json_decode($data
尝试从ajax请求中删除"dataType:"JSON"并进行检查。