通过ajax发送POST json数据时,发送了一个空数组。

10
我正在尝试通过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');

}

    array(0) {
    }

我正在使用(alert)并且通过POST方法在firebug中显示所有正确的参数,但唯一可以传递任何数据的方式是使用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

1
在 PHP 脚本接收发布的数据之前,您是否有任何“偶发”的重定向? - Cheery
Firebug会显示所有从被调用的PHP脚本返回的响应。 - Mike
@Mike 我的意思是服务器端的任何302重定向?它将丢失POST数据。你在$_SERVER['REQUEST_METHOD']中有什么? - Cheery
没有重定向,请求方法为post。 - Mike
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Mathijs Segers
显示剩余2条评论
7个回答

11
我对你使用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);
                      }
         });

这是内容类型!这简直是噩梦! - Mike
因为像内容类型这样愚蠢的问题,我浪费了5个小时!它看起来仍然很糟糕,但我还没有机会添加 stripslashes。 - Mike
具有讽刺意味的是,在看到你的回答之前,我实际上已经尝试过了,并且它起作用了。但毫无疑问,你的回答就是它!谢谢。 - Mike
我认为你只是从php页面错误地获取了它!请阅读下面的我的评论。 - dkulkarni
@Mike 很抱歉听到这个消息。很高兴你自己解决了它! - Steven Wexler
显示剩余2条评论

2

使用

data:{myData: jsontosend}

这将在您的请求中将myData作为参数发送。


我已经尝试了不同的组合,包括在mydata周围加上""和不加"",但它仍然返回一个空数组。 - Mike
2
嘿,你尝试从php输入数据流中获取数据了吗? <?php $data = file_get_contents('php://input'); $data = json_decode($data, true); print_r($data); ?> - dkulkarni
5
当您使用JSON内容类型时,在PHP端,需要使用php://input流直接手动读取请求正文中的JSON字符串。 - dkulkarni
我没有尝试过那个,但删除内容类型可以解决问题。 - Mike
我刚刚测试了你的方法(完全复制/粘贴你的代码),它返回了null。 - Mike

2

2
我发现dkulkarni提供的评论是这里最好的解决方案。为了获取任何复杂度的POST数据,必须直接从输入流中读取。更改$.ajax({contentType: ''})的值对我没有用。 为了解决这个问题,我设置了一个控制器方法来回显我要发布到服务器的JSON。更改ContentType标头没有任何区别。 但是在阅读了dkulkarni的评论后,我将我的服务器代码从以下内容更改:
    return $_POST;

转换为:

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

它完美地工作了。


这真是太聪明了。谢谢你!!!感谢dkulkami的评论,也感谢你通过这个答案让解决方案更加明显。我已经花了几个小时来弄清楚为什么$_POST为空... - kpollock

1

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

我尝试了许多不同的方法进行测试,但每当我将Content-Type设置为JSON时,PHP中的$ _POST为空。

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

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


你能不能保留数据类型为"JSON",但仍然删除内容类型?那是我所做的,而且它完美地工作了。虽然在看到Steven Wexler的答案之前,我花了几个小时拔光了我的头发。 - Mike

1
将contentType删除并不是一个好主意。您确实希望以JSON格式发送这些数据。关键是要做如上所述的事情,而不是尝试在接收端(目标PHP文件)使用$data = $_POST访问数据,关键是使用$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

0
尝试从AJAX请求中删除“dataType:“JSON””,然后检查。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接