如何从 jQuery.ajax 获取响应状态码?

Posted

技术标签:

【中文标题】如何从 jQuery.ajax 获取响应状态码?【英文标题】:How to get response status code from jQuery.ajax? 【发布时间】:2011-07-17 16:19:07 【问题描述】:

在下面的代码中,我要做的就是从 jQuery.ajax 调用中获取 HTTP 响应代码。然后,如果代码是 301(永久移动),则显示 'Location' 响应头:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <title>jQuery 301 Trial</title>
  <script src="http://code.jquery.com/jquery-1.5.1.min.js"></script>

  <script type="text/javascript">
  function get_resp_status(url) 
    $.ajax(
      url: url,
      complete: function (jqxhr, txt_status) 
        console.log ("Complete: [ " + txt_status + " ] " + jqxhr);
        // if (response code is 301) 
        console.log ("Location: " + jqxhr.getResponseHeader("Location"));
        // 
      
    );
  
  </script>
  <script type="text/javascript">
  $(document).ready(function()
    $('a').mouseenter(
      function () 
        get_resp_status(this.href);
      ,
      function () 
      
    );
  );
  </script>
</head>
<body>
  <a href="http://ow.ly/4etPl">Test 301 redirect</a>
  <a href="http://cnn.com/not_found">Test 404 not found</a>
</body>
</html>

有人能指出我哪里出错了吗?当我在 Firebug 中检查“jqxhr”对象时,找不到状态代码,也找不到“Location”响应标头。我在“完成”的最后一行设置断点。

非常感谢。

【问题讨论】:

api.jquery.com/jQuery.ajax 我知道这是旧的,但我想我解决了它(XHR.responseURL):***.com/a/39416846/4946681 【参考方案1】:

我在 jqXhr 对象上看到了状态字段,这是它的工作原理:

http://jsfiddle.net/magicaj/55HQq/3/

$.ajax(
    //...        
    success: function(data, textStatus, xhr) 
        console.log(xhr.status);
    ,
    complete: function(xhr, textStatus) 
        console.log(xhr.status);
     
);

【讨论】:

它似乎在 jsFiddle 中工作。基于此和 jQuery 文档, xhr.status 应该做我想要的。但是,当我在原始代码中尝试相同的操作(txt_status 替换为 jqxhr.status)时,jqxhr.status 一直为 0。这是截图:twitpic.com/4alsqj 我认为问题在于您不是针对 Web 服务器运行,而是从文件系统本地运行。我认为如果您启动本地 Web 服务器,这将正常工作,这里有一些关于该主题的文章:pearweb.com/javascript/XMLHttpRequest.htmldeveloper.mozilla.org/En/Using_XMLHttpRequest“这里要注意的关键是结果状态与 0 进行比较表示成功而不是200.这是因为文件和ftp方案不使用HTTP结果码。” 这很棒。尤其是当我可以让我的后端发送状态码时。 请注意,如果响应是像 302 这样的重定向状态,这将给出 200【参考方案2】:

我自己在寻找类似解决方案时遇到了这个旧线程,并发现接受的答案是使用jquery ajax.complete() 方法。我在这里引用jquery website 的通知:

jqXHR.success()、jqXHR.error() 和 jqXHR.complete() 回调在 jQuery 1.8 中被弃用。要为最终删除代码做好准备,请改用 jqXHR.done()、jqXHR.fail() 和 jqXHR.always()

要知道ajax响应的status code,可以使用以下代码:

$.ajax( url [, settings ] )
.always(function (jqXHR) 
    console.log(jqXHR.status);
);

.done().fail() 的工作方式类似

【讨论】:

返回“未定义”【参考方案3】:

使用传递给 $.ajax 函数的参数对象的 statusCode 属性可能更符合 jQuery 的习惯:

$.ajax(
  statusCode: 
    500: function(xhr) 
      if(window.console) console.log(xhr.responseText);
    
  
);

但是,正如Livingston Samuel 所说,无法在javascript中捕获301状态代码。

【讨论】:

当我试图捕捉这样的多个状态码时,net::ERR_CONNECTION_RESET 诅咒。有解决这个问题的想法吗? 它不适用于重定向【参考方案4】:

当您的 XHR 请求返回重定向响应(HTTP 状态 301、302、303、307)时,XMLHttpRequest automatically follows the redirected URL and returns the status code of that URL。

您可以通过 xhr 对象的status 属性获取非重定向状态代码(200、400、500 等)。

因此,您无法从 301302303307 请求的响应标头中获取重定向位置。

您可能必须更改您的服务器逻辑,以便以您可以处理重定向的方式进行响应,而不是让浏览器来处理。一个example implementation。

【讨论】:

【参考方案5】:

您可以检查您的响应内容,只需 console.log 即可,您将看到 whitch 属性有一个状态码。不了解jsons的可以参考视频:https://www.youtube.com/watch?v=Bv_5Zv5c-Ts

它解释了非常基础的知识,让您对 javascript 感到更自在。

您可以使用更短版本的 ajax 请求来完成,请参阅上面的代码:

$.get("example.url.com", function(data) 
                console.log(data);
            ).done(function() 
               // TO DO ON DONE
            ).fail(function(data, textStatus, xhr) 
                 //This shows status code eg. 403
                 console.log("error", data.status);
                 //This shows status message eg. Forbidden
                 console.log("STATUS: "+xhr);
            ).always(function() 
                 //TO-DO after fail/done request.
                 console.log("ended");
            );

控制台输出示例:

error 403 
STATUS: Forbidden 
ended

【讨论】:

感谢您提供如何使用 done、fail 和 always 的完整代码,以及完整的函数参数。【参考方案6】:

注意:使用 jQuery 3.4.1

$.ajax(
  url: URL,
  success: function(data, textStatus, jqXHR)
    console.log(textStatus + ": " + jqXHR.status);
    // do something with data
  ,
  error: function(jqXHR, textStatus, errorThrown)
    console.log(textStatus + ": " + jqXHR.status + " " + errorThrown);
  
);

【讨论】:

【参考方案7】:

jqxhr 是一个 json 对象:

完整返回: jqXHR(在 jQuery 1.4.x 中, XMLHTTPRequest) 对象和一个字符串 对请求的状态进行分类 (“成功”,“未修改”,“错误”, “超时”、“中止”或“解析器错误”)。

见: jQuery ajax

所以你会这样做:

jqxhr.status 获取状态

【讨论】:

以上是关于如何从 jQuery.ajax 获取响应状态码?的主要内容,如果未能解决你的问题,请参考以下文章

jQuery AJAX 错误处理(HTTP 状态码)

如何从 REST API 获取响应并从 jquery ajax 调用执行操作?

fetch概述以及请求方式

如何从 WinHttp 请求中获取 HTTP 状态码?

如何使用 JQuery.ajax 从每个 WordPress 帖子中获取缩略图附件?

在主干js中执行model.save后如何获取响应的确切状态码