Ajax 状态为 200 但错误事件触发而不是成功

Posted

技术标签:

【中文标题】Ajax 状态为 200 但错误事件触发而不是成功【英文标题】:Ajax status is 200 but error event triggers instead of success 【发布时间】:2020-04-16 10:41:56 【问题描述】:

今天我面临一个以前从未遇到过的奇怪问题。我的 ajax 调用返回状态为 200 的响应,但不知何故它总是触发错误事件而不是成功。这就是我正在做的事情

$.ajax(
        type: "GET",
        url: "swap.php",
        data: "key=dbdcd39f0f8f5077e7308f3d3d5d8cac&code="+$("#code").val(),
        contentType: 'application/json; charset=utf-8',
        dataType:"json",
        beforeSend: function() 
                $("#msg").html("<img src='imgs/loading_circle.gif'/>");
        ,
        success: function(result)
                alert(result);
        ,
        error: function(xhr,status,error)
            alert(error.Message); // receiving Undefined message
        
    );

swap.php的PHP代码

<?php
header('Content-Type: application/json');
$resp["data"]="Record updated successfully";
print json_encode($resp);
?>

这是我直接把网址放在地址栏时得到的响应

下面是chrome的network tab截图

【问题讨论】:

您是否使用 json_encode 发送响应? 否,但响应状态为 200,我正在做一些数据库工作,这些工作也根据提供的参数成功更新。 在 jQuery .ajax() 中,如果指定了 dataType: 'json' 设置,服务器必须返回一个有效的 JSON 格式的字符串,否则会抛出错误。 是的,试试这个方法 echo json_encode($resp);die; 这可能是跨域错误,因为在您的代码中我可以看到它正在将请求作为选项而不是 get 发送 【参考方案1】:

您显示的响应图像不是实际请求,它是飞行前检查,检查请求方法它是 OPTIONS 而不是 "GET" 您正在尝试。它只是检查此请求中的"CORS"。不是实际的 ajax 调用。

在此之后检查实际请求。你会发现错误。

【讨论】:

在此请求的标头中,您会看到“请求方法:OPTIONS”。这意味着 ajax 只是通过某种握手技术验证它是否可以访问资源,而不是调用实际请求。所以会有2个ajax调用。过滤您的请求并检查所有“XHR”请求。你会在那里找到第 2 个请求。 以及您在响应另一个请求时看到的内容,以及状态如何? console.log(xhr),错误函数的第一个参数,看看那里发生了什么。 就是这样......这就是错误所在,这就是触发错误功能的原因。现在你需要解决这个问题,你可以看这里***.com/questions/50873764/… 通过从请求标头中删除内容和数据类型解决了该问题。 Corssorigin 不是问题,因为我在同一个项目中有很多 ajax 请求请求同一个服务器并且之前没有遇到过这个问题。但这是我第一次使用查询字符串参数进行 GET 操作。我以前总是使用表单值。【参考方案2】:

您可以尝试传递自定义标头

headers: 
            'Content-Type': 'application/json',
            "Accept": 'application/json',
        

【讨论】:

它通过从请求标头中删除内容类型和数据类型来工作。因为我正在使用查询字符串参数。

以上是关于Ajax 状态为 200 但错误事件触发而不是成功的主要内容,如果未能解决你的问题,请参考以下文章

ajax请求成功返回200,但还是进入error事件

Ajax 调用触发错误事件但返回 200 ok

ajax请求成功,状态却是200

[当PHP代码失败但发送200时如何处理AJAX?

无法到达 AJAX 成功事件

NSURLConnection 返回错误而不是响应 401