通过 ajax POST json 数据发送一个空数组
Posted
技术标签:
【中文标题】通过 ajax POST json 数据发送一个空数组【英文标题】:POST json data via ajax sends an empty array 【发布时间】:2012-02-17 11:42:48 【问题描述】:我正在尝试通过 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 端,当我 print_r($_POST) 它只是说
array(0)
我正在提醒 (jsontosend),它完美地向我展示了一切,以及在使用 post 方法的 firebug 中,它以完美干净的方式显示了所有发送的参数。
它传递任何数据的唯一方法是我使用 GET 方法。
非常感谢任何建议!
编辑:从 firebug 添加 POST 数据。 这是警报功能发出的警报:
"address":["id":1473294,"streetaddress":"3784 Howard Ave","city":"Washington DC","state":"DC","zipcode":20895,"latitude":39.027820587]
这是萤火虫在使用 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
【问题讨论】:
在发布的数据到达 php 脚本之前,您是否有任何“偶尔”重定向? 我不这么认为,但我不确定我是否完全理解您的意思。 "当我 print_r..." 你是什么意思?在浏览器中打开此页面? firebug 显示来自被调用的 php 脚本的所有响应。 @Mike 我的意思是服务器端的任何 302 重定向?它将丢失发布数据。你在 $_SERVER['REQUEST_METHOD'] 中有什么? 【参考方案1】:我对您使用 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);
);
【讨论】:
它是内容类型!这是一场噩梦! 因为内容类型这样愚蠢的东西而浪费了 5 个小时!它看起来仍然很糟糕,但我还没有机会添加stripslashes。 具有讽刺意味的是,我实际上只是在看到您的答案之前尝试过它并且它有效。但你的答案绝对是它!谢谢 我认为您只是从 php 页面获取错误!在下面阅读我的评论 @Mike 很遗憾听到这个消息。很高兴你自己解决了!【参考方案2】:使用
data:myData: jsontosend
它应该在您的请求中将 myData 作为参数发送。
【讨论】:
我已经尝试了不同的组合,在 mydata 周围有和没有“”,它仍然返回一个空数组。 您好,您是否尝试过从 php 输入数据流中获取数据?<?php $data = file_get_contents('php://input'); $data = json_decode($data, true); print_r($data); ?>
当您使用 JSON 内容类型时,在 PHP 端,需要使用 php://input 流直接从请求正文中手动读取 JSON 字符串。
我没试过,但删除内容类型修复了它。
我刚刚测试了你的方法,(完全复制/粘贴你的代码),它返回 null【参考方案3】:
PHP 不理解 application/json 请求(默认情况下)。 看到这个问题:How to post JSON to PHP with curl
【讨论】:
【参考方案4】:我发现 dkulkarni 提供的评论是这里最好的解决方案。有必要直接从输入流中读取以获取任何复杂的 POST 数据。更改 $.ajax(contentType: '')
的值对我不起作用..
为了解决这个问题,我设置了一个控制器方法来回显我发布到服务器的 JSON。更改 ContentType 标头没有任何区别。 但是在阅读了 dkulkarni 的评论后,我改变了我的服务器代码:
return $_POST;
到这里:
$data = file_get_contents('php://input');
return json_decode($data);
效果很好。
【讨论】:
这真是天才。谢谢!!!!感谢 dkulkami 的评论,并感谢您通过此答案使解决方案更加明显。我花了几个小时试图弄清楚为什么 $_POST 是空的......【参考方案5】:正如 dkulkarni 在他的帖子(1 月 24 日 7:53)中评论的那样,检索使用 Content-Type application/json 发送的 JSON 的唯一方法似乎是直接从输入流中检索它。
我用不同的方法做了很多测试,但总是当我将 Content-Type 设置为 JSON 时,PHP 中的 $_POST 是空的。
我的问题是我需要将 Content-Type 设置为 JSON,因为服务器(我无权访问)需要它,否则它会返回不受支持的数据类型。我想他们是直接从输入流中检索的。
为什么我必须在自己的 PHP 文件中重现它?因为我需要为测试问题做一个代理,但这不是这个线程的重点。
【讨论】:
你不能离开 datatype: "JSON" 并且仍然删除 content-type 吗?这就是我所做的,而且效果很好。尽管我花了好几个小时才看到 Steven Wexler 的回答。【参考方案6】:取出 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
【讨论】:
【参考方案7】:尝试从 ajax 请求中删除 'dataType: "JSON" ' 并检查。
【讨论】:
以上是关于通过 ajax POST json 数据发送一个空数组的主要内容,如果未能解决你的问题,请参考以下文章
通过 POST (ajax) 发送 JSON 数据并从 Controller (MVC) 接收 json 响应