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-Type
是application/x-www-form-urlencoded
,它告诉PHP将数据解码为POST字段并填充$_POST
。 你的脚本会从$_POST
(或者$_REQUEST
)中恢复它的参数。
通过将其更改为application/json
, $_POST
将不再被填充,接收脚本操作将不会收到它所期望的参数,并且操作会中断。
所以你要么需要:
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