通过 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 数据发送一个空数组的主要内容,如果未能解决你的问题,请参考以下文章

jquery的$post方法不发送空数组的解决办法

通过 POST (ajax) 发送 JSON 数据并从 Controller (MVC) 接收 json 响应

如何通过 POST (Ajax) 发送 JSON 数据并从 Struts 2 操作接收 JSON 响应

在 POST 数据之前替换 JSON 中的文本

如何通过ajax从表单发送POST数据数组?

使用Ajax(无表单)将POST数据以JSON格式发送到Symfony2 Controller