Ajax调用contentType:'application / json'不起作用

我有一个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));
}

当使用contentType: 'application/json'你将无法依赖被填充的$_POST$_POST仅填充表单编码的内容类型。

因此,您需要像这样从PHP原始输入中读取数据:

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

当然,如果你想发送application/json你应该发送JSON,这是你没有做的。 您需要直接将对象序列化构建为JSON,或者需要执行类似操作 - 使用jQuery将表单数据转换为JavaScript对象 - 从表单序列化对象。

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


您引用的最佳做法是关于 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/x-www-form-urlencoded; charset=UTF-8
  • 设置application/json; charset=UTF-8的内容类型application/json; charset=UTF-8 application/json; charset=UTF-8并修改脚本以解析POST流并解码JSON数据; 看到这个答案。
  • 第三个选项需要正确处理php://input


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

    if(isset($_POST['ajax']) && $_POST['ajax'] === '1') {
        header('Content-Type: application/json');
        echo json_encode(validateForm($_POST));
    }
    
    链接地址: http://www.djcxy.com/p/46237.html

    上一篇: Ajax call with contentType: 'application/json' not working

    下一篇: Error instantiating servlet class