使用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-Type
是application/x-www-form-urlencoded
,它告诉PHP将数据解码为POST字段并填充$_POST
。 然后,您的脚本将从$_POST
(或者可能是$_REQUEST
)恢复其参数。
通过将其更改为application/json
,将不再填充$_POST
,接收脚本操作将不会接收到预期的参数,并且操作会中断。
所以你要么:
- 不自己指定内容类型(更好,恕我直言)
- 设置
application/x-www-form-urlencoded; charset=UTF-8
-type ofapplication/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)); }