使用contentType调用Ajax:'application / json'无效

时间:2013-11-30 00:22:01

标签: php jquery ajax json content-type

我有一个ajax调用,它将表单数据发送到php函数。由于我阅读了很多使用contentType: 'application/json'是最佳做法,我也想尝试一下。但不幸的是,当我使用它时,我的脚本不会返回任何内容。如果我删除它,脚本会执行它应该执行的操作。

你知道原因是什么以及为什么?谢谢!

$('#Form').submit(function(e) {
            e.preventDefault();

            var content = $(this).serialize() + "&ajax=1";

            $.ajax('app/class/controller/contactForm.php', {
              type: "POST",
              //contentType: 'application/json',
              dataType: 'json',
              data: content,
              success: function(result) {
                  console.log(result);
              }
            });
        })

和我的PHP:

if(isset($_POST['ajax']) && $_POST['ajax'] === '1') {
    echo json_encode(validateForm($_POST));
}

3 个答案:

答案 0 :(得分:18)

使用contentType: 'application/json'时,您将无法依赖$_POST进行填充。 $_POST仅填充表单编码的内容类型。

因此,您需要从PHP原始输入中读取数据,如下所示:

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

当然,如果您想发送application/json,您实际上应该发送JSON,而您不会这样做。您需要直接将对象序列化构建为JSON,或者需要执行类似这样的操作 - Convert form data to JavaScript object with jQuery - 从表单序列化对象。

老实说,因为你正在处理表单数据,我不认为使用application/json的用例就在那里。

答案 1 :(得分:3)

您提到的最佳做法是服务器脚本将JSON的Content-Type设置为“application / json”:

Header('Content-Type: application/json; charset=UTF8');

这是因为否则会发送默认Content-Type,通常是全能text/html,这可能会导致对客户的不理解。

如果在jQuery请求中指定自己的Content-Type,jQuery将确定最合适的一个。这里的问题是您发送的是 POST表单jQuery设置的默认Content-Typeapplication/x-www-form-urlencoded,告诉PHP将数据解码为POST字段并填充$_POST。然后,您的脚本将从$_POST(或者$_REQUEST)恢复其参数。

通过将其更改为application/json,将不再填充$_POST,接收脚本操作将不会收到预期的参数,并且操作会中断。

所以你需要:

  • 未自行指定Content-Type(更好,恕我直言)
  • 设置内容类型application/x-www-form-urlencoded; charset=UTF-8
  • 设置内容类型application/json; charset=UTF-8并修改脚本以解析POST流并解码JSON数据;见this answer

第三个选项需要php://input的{​​{3}}。

答案 2 :(得分:1)

PHP脚本应该设置Content-Type标题。

if(isset($_POST['ajax']) && $_POST['ajax'] === '1') {
    header('Content-Type: application/json');
    echo json_encode(validateForm($_POST));
}