Ajax调用中的contentType: 'application/json'不起作用

13 浏览
0 Comments

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));
}

0
0 Comments

问题出现的原因是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请求的预期不符。

0
0 Comments

问题原因:发送的请求中设置了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,以便客户端能够正确解析响应的格式。

0
0 Comments

当使用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);

0