通过ajax POST json数据发送一个空数组

时间:2012-01-24 07:16:31

标签: php ajax arrays json

我正在尝试通过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 mothod的firebug,它以完美的清洁方式显示所有的params。

传递任何数据的唯一方法是使用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

7 个答案:

答案 0 :(得分:8)

我对你使用contentType属性的方式持怀疑态度。尝试取出contentType。默认内容类型是 application / 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);
                      }
         });

答案 1 :(得分:2)

使用

data:{myData: jsontosend}

它应该在您的请求中将myData作为参数发送。

答案 2 :(得分:2)

PHP无法理解application / json请求(默认情况下)。 请参阅此问题:How to post JSON to PHP with curl

答案 3 :(得分:2)

我发现dkulkarni提供的评论是最好的解决方案。有必要直接从输入流中读取以获得任何复杂性的POST数据。更改$.ajax({contentType: ''})的值对我来说不起作用..

为了解决这个问题,我设置了一个控制器方法来回显我发布到服务器的JSON。更改ContentType标头没有任何区别。 但在阅读dkulkarni的评论后,我改变了我的服务器代码:

    return $_POST;

到此:

    $data = file_get_contents('php://input');
    return json_decode($data);

效果很好。

答案 4 :(得分:1)

正如dkulkarni在他的帖子(1月24日7:53)中评论的那样,检索使用Content-Type application / json发送的JSON的唯一方法似乎是直接从输入流中检索它。

我用不同的方法做了很多测试,但是当我将Content-Type设置为JSON时,PHP中的$ _POST是空的。

我的问题是我需要将Content-Type设置为JSON,因为服务器(我没有访问权限)需要它,否则返回不支持的数据类型。我想他们是直接从输入流中检索的。

为什么我必须在自己的PHP文件中重现它?因为我需要为测试问题制作代理,但这不是这个问题的重点。

答案 5 :(得分:0)

尝试从ajax请求中删除'dataType:“JSON”'并检查。

答案 6 :(得分:0)

将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