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

280
在下面的代码中,我所做的就是从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”响应头。 我在“complete”函数的最后一行设置断点。

非常感谢。


1
https://api.jquery.com/jQuery.ajax/ - ehsan
我知道这已经过时了,但我认为我解决了它(XHR.responseURL):https://dev59.com/jG025IYBdhLWcg3wIyOf#39416846 - Nate
7个回答

271

我在jqXhr对象上看到了状态字段,这里有一个能够工作的fiddle链接:

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

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

4
在 jsFiddle 上似乎有效。基于此和 jQuery 文档,xhr.status 应该可以实现我想要的功能。然而,在我的原始代码中尝试相同操作(将 txt_status 替换为 jqxhr.status),我仍然得到 jqxhr.status 为 0 的结果。这是一个截图:http://twitpic.com/4alsqj。 - Mahesh
11
我认为问题在于您没有针对Web服务器运行,而是从文件系统本地运行。我认为如果您启动本地Web服务器,这将能够正常工作,以下是一些与此主题相关的文章:http://www.pearweb.com/javascript/XMLHttpRequest.html https://developer.mozilla.org/En/Using_XMLHttpRequest。需要注意的关键是,结果状态被与0进行比较以表示成功,而不是200。这是因为文件和FTP方案不使用HTTP结果代码。 - Adam Ayres
这太棒了,特别是当我可以让我的后端发送状态码时。 - pizza247
请注意,如果响应是重定向状态(如302),这将返回200。 - Accountant م

59

在搜寻类似解决方案时,我碰巧发现了这个旧线程,并发现被接受的答案使用了jquery ajax.complete()方法。我在此引用了来自jquery官网的通知:

jqXHR.success()、jqXHR.error() 和 jqXHR.complete() 回调已自jQuery 1.8起被弃用。为了准备将来他们被移除的情况,请改用jqXHR.done()、jqXHR.fail()和jqXHR.always()。

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

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

对于.done().fail()同样适用


4
这个返回了"undefined"。 - Pedro Joaquín

57

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

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

然而,正如Livingston Samuel所说,JavaScript无法捕获301状态码。


当我尝试捕获多个状态码时,例如net::ERR_CONNECTION_RESET,发生了错误。有什么修复的想法吗? - Saghachi
它不能与重定向一起使用。 - Alex78191

43

当您的XHR请求返回重定向响应(HTTP状态301,302,303,307)时,XMLHttpRequest 会自动跟随重定向URL并返回该URL的状态代码

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

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

您可能需要更改服务器逻辑以以一种您可以处理重定向的方式来响应,而不是让浏览器来处理。示例实现


33

您可以检查响应内容,只需console.log它,您就会看到哪个属性具有状态代码。如果您不了解json,请参考视频: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

1
感谢您提供如何使用done、fail和always的完整代码,包括所有函数参数。 - IvanD

19

注意:使用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);
  }
});

4

jqxhr是一个JSON对象:

complete返回:
jqXHR(在jQuery 1.4.x中为XMLHTTPRequest)对象和一个字符串,用于分类请求的状态(“success”,“notmodified”,“error”,“timeout”,“abort”或“parsererror”)。

参见: jQuery ajax

因此,您可以执行以下操作:

jqxhr.status 获取状态


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接