Php 通过ajax发布json数据会发送一个空数组
我试图通过ajax发布数据,以下是我的信息:Php 通过ajax发布json数据会发送一个空数组,php,ajax,arrays,json,Php,Ajax,Arrays,Json,我试图通过ajax发布数据,以下是我的信息: var jsondata = {"address" : [ { "id": addid, "streetaddress": streetaddress, "city": city, "state": state, "zipcode": zipcode, "latitude": latitude}, ] }; v
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');
{"address":[{"id":1473294,"streetaddress":"3784 Howard Ave","city":"Washington DC","state":"DC","zipcode":20895,"latitude":39.027820587}]}
}
在php端,当我打印r($\u POST)时,它只是说
array(0) {
}
我在提醒(jsontosend),它完美地向我展示了一切,在firebug使用post-mothod时,它以完美干净的方式展示了所有发送的参数
它传递任何数据的唯一方法是使用GET方法
非常感谢您的建议
编辑:从firebug添加POST数据。
这是警报功能发出的警报:
$.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');
{"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
这是对$u POST的var_dump的响应:
array(0) {
}
这是$u POST['myData'的var_转储
NULL
使用
data:{myData:jsontosend}
它应该将myData作为您请求中的参数发送。尝试从ajax请求中删除'dataType:'JSON',然后检查。我怀疑您使用contentType属性的方式。尝试取出contentType。默认内容类型为 application/x-www-form-urlencoded() 另外,对数据属性使用类似{mydata:jsontosend}的内容
$.ajax({
type: "POST",
url: "process.php",
//contentType: "application/json; charset=utf-8",
dataType: "JSON",
data: {mydata: jsontosend},
success: function(msg){
alert(msg);
}
});
正如dkulkarni在他的帖子(1月24日7:53)中所评论的,检索内容类型application/JSON发送的JSON的唯一方法似乎是直接从输入流检索它 我用不同的方法做了很多测试,但是当我将Content Type设置为JSON时,PHP中的$\u POST总是空的 我的问题是我需要将内容类型设置为JSON,因为服务器(我没有访问权限)需要它,否则它将返回不支持的数据类型。我想他们是直接从输入流中检索的
为什么我必须在自己的PHP文件中复制它?因为我需要为测试问题创建一个代理,但这不是本线程的重点。PHP不理解应用程序/json请求(默认情况下)。
查看此问题:我发现dkulkarni提供的评论是这里的最佳解决方案。有必要直接从输入流读取,以获得任何复杂的POST数据。更改
$.ajax({contentType:'})
的值对我不起作用
为了解决这个问题,我设置了一个控制器方法来回显我发布到服务器上的JSON。更改ContentType标题没有任何区别。
但在阅读了dkulkarni的评论后,我更改了服务器代码:
return $_POST;
为此:
$data = file_get_contents('php://input');
return json_decode($data);
它工作得很好。删除contentType不是一个好主意。您确实希望以JSON格式发送此数据。关键是要执行上面提到的操作,而不是尝试使用$data=$\u POST访问接收端(目标php文件)上的数据,关键是使用$data=file\u get\u contents('php://input'); 下面是一个使用php和knockout.js的场景的完整往返示例: JS(在请求页面上): 然后在target.php(接收请求的页面)中:
在发布的数据到达php脚本之前,您是否有任何“偶尔”重定向?我不这么认为,我不确定我是否完全理解您的意思。“当我打印时…”您是什么意思?在浏览器中打开此页?firebug会显示所调用php脚本的所有响应。@Mike,我是说服务器端的302重定向?它将丢失post数据。$\u SERVER['REQUEST\u METHOD']中有什么内容?我尝试了不同的组合,在mydata中使用“”和不使用“”,但它仍然返回一个空数组。嘿,您尝试过从php输入数据流中获取数据吗
当您使用JSON内容类型时,在PHP端,有必要使用php://input 我还没有尝试过,但是删除内容类型修复了它。我刚刚测试了你的方法,(准确地复制/粘贴你的代码),它返回nullit is content type!这是一场噩梦!因为像内容类型这样愚蠢的事情浪费了5个小时!它看起来仍然很糟糕,但我还没有机会添加斜杠。讽刺的是,在我看到你的答案之前,我实际上只是尝试了一下,结果成功了。但你的答案是最肯定的!谢谢,我想你只是从php页面取错了!阅读我的评论below@Mike很遗憾听到这个消息。很高兴你自己发现了!您不能保留数据类型:“JSON”而仍然删除内容类型吗?我就是这么做的,而且效果很好。虽然我花了好几个小时才看到史蒂文·韦克斯勒的答案,但这绝对是天才。非常感谢。感谢dkulkami的评论,也感谢您通过这个答案使解决方案更加明显。我花了好几个小时试图弄明白为什么$u帖子是空的。。。