使用contentType调用Ajax:’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 ,通常是catch-all text/html ,这可能导致对客户端的不理解。

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

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

所以你要么:

  • 不自己指定内容类型(更好,恕我直言)
  • 设置application/x-www-form-urlencoded; charset=UTF-8 -type of application/x-www-form-urlencoded; charset=UTF-8 application/x-www-form-urlencoded; charset=UTF-8
  • 设置Content-Type of 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)); }