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