1

一个.php

$(document).ready(function() {
    $("#submit_form").on("click",function(){
        var json_hist =  <?php echo $json_history; ?>;
        $.ajax({
            type: "POST",
            url: "b.php",
            data: "hist_json="+JSON.stringify(json_hist),
            //contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(data){alert(data);},
            failure: function(errMsg) {
                alert(errMsg);
            }
        });  
    }); 
})

b.php

$obj=json_decode($_POST["hist_json"]);
var_dump($_POST);

如果我评论 contentType: "application/json; charset=utf-8" 一切正常,但如果取消评论。var 转储将返回 null。

4

3 回答 3

1

当您在 ajax 中设置 contentType 时,您正在为请求而不是响应设置 contentType。

它使用 JSON contentType 失败,因为您发送的数据是键/值格式的数据(缺少编码),因此数据与 contentType 不匹配。JSON contentType 标头适用于您发送没有标识符的原始 JSON,但在您的情况下,您有一个 identifier hist_json=

我建议改为:

data: { hist_json : JSON.stringify(json_hist) },

使用带有hits_json键的对象意味着 jQuery 将安全地对 JSON进行 URL 编码,并允许 PHP 使用$_POST['hits_json'].


如果要使用 JSON contentType,则必须将 ajax 更改为:

data: { JSON.stringify(json_hist) }, // <-- no identifier

和 PHP:

$obj = json_decode($HTTP_RAW_POST_DATA);
var_dump($obj);
于 2013-07-11T07:43:52.423 回答
0

您已注释掉的行正在尝试将Content-type:标题更改为application/json. 虽然您发送的数据是 JSON 格式,但数据是作为 HTTP POST 请求传输的,因此您需要使用application/x-www-form-urlencoded;默认的内容类型。这就是为什么它可以在删除线的情况下工作。

于 2013-07-11T07:45:55.787 回答
0

据我所知,这是出现在 FireFox 中的错误。

您可以在http://bugs.jquery.com/ticket/13758上阅读更多内容

stackoverflow中也有关于它的主题

无法在 jQuery.ajax 中将内容类型设置为“应用程序/json”

于 2013-07-11T07:44:25.057 回答