【问题标题】:How to get response status code from jQuery.ajax?如何从 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”响应标头。我在“完成”的最后一行设置断点。

非常感谢。

【问题讨论】:

标签: ajax jquery-1.5


【解决方案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 获取状态

      【讨论】:

        猜你喜欢
        • 2011-10-17
        • 2020-01-10
        • 1970-01-01
        • 2020-08-19
        • 1970-01-01
        • 2021-05-14
        • 2021-10-03
        • 2015-05-21
        • 1970-01-01
        相关资源
        最近更新 更多