Ajax调用中的contentType: 'application/json'不起作用
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)); }
问题出现的原因是PHP脚本没有设置Content-Type头。解决方法是在PHP脚本中添加以下代码:
if(isset($_POST['ajax']) && $_POST['ajax'] === '1') { header('Content-Type: application/json'); echo json_encode(validateForm($_POST)); }
然而,仍然存在问题,我只得到一个空的响应。
你说得对,PHP脚本应该发送这样的头部,但这与问题无关。问题在于通过将application/json
设置为初始AJAX调用到PHP的内容类型,PHP没有构建$_POST
。还有一个问题是,他根本没有发送JSON,而是发送了一个经过url编码的查询字符串,这与通常使用的表单编码POST请求的预期不符。
问题原因:发送的请求中设置了Content-Type为application/json,而服务端脚本期望接收的是application/x-www-form-urlencoded类型的数据,导致无法正确解析参数。
解决方法:
1. 不指定Content-Type,让jQuery自动确定最合适的类型。
2. 设置Content-Type为application/x-www-form-urlencoded; charset=UTF-8。
3. 设置Content-Type为application/json; charset=UTF-8,并修改脚本来解析POST流和解码JSON数据。
第三种方法需要对php://input进行适当的处理。
在发送请求时,应该设置正确的Content-Type,以便服务端能够正确解析请求。同样,在服务端响应时,也应该设置正确的Content-Type,以便客户端能够正确解析响应的格式。
当使用contentType: 'application/json'
时,无法依靠$_POST
来获取数据。只有对于表单编码的内容类型,$_POST
才会被填充。
因此,您需要像这样从PHP的原始输入中读取数据:
$input = file_get_contents('php://input'); $object = json_decode($input);
当然,如果您想发送application/json
,您应该实际上发送JSON,而您没有这样做。您可以直接将对象序列化为JSON,或者可以像这样做 - 使用jQuery将表单数据序列化为JavaScript对象 - 将对象从表单序列化为JSON。
老实说,在您的情况下,由于您处理的是表单数据,我不认为使用application/json
的用例存在。
谢谢!我想这就是问题的根源。我看到一些示例将表单数据序列化并设置了contentType。这就是为什么我认为应该是这样的。
当然,PHP可以根据您想要处理的数据类型以JSON进行响应。这实际上可能取决于您在JavaScript中提供数据的方式,以确定您想要如何将数据POST到PHP并与之交互。例如,如果您有一个很好的JavaScript对象要POST到PHP,将其序列化为JSON并使用application/json
发送数据,PHP可以简单地解码该对象并与之交互。
感谢解释$_POST
未填充的问题。这是我正在寻找的信息。
您的答案在我花了几个小时寻找之后帮助了我,尽管我使用的是json_decode而不是json_encode,因为数据已经是JSON格式,所以您需要解码它。所以这就是我所做的:$rawPostData = file_get_contents('php://input'); $json = json_decode($rawPostData);