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


230

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

<?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”响应标头。我将断点设置在“完成”的最后一行。

非常感谢。



我知道这已经很老了,但我想我已经解决了(XHR.responseURL):stackoverflow.com/a/39416846/4946681
Nate

Answers:


221

我在jqXhr对象上看到了status字段,这是一个正在工作的小提琴:

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

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

2
似乎在jsFiddle中工作。基于该文档和jQuery文档,xhr.status应该可以执行我想要的操作。但是,当我在原始代码中尝试相同的操作时(用jqxhr.status替换了txt_status),我的jqxhr.status始终为0。这是屏幕截图:twitpic.com/4alsqj
Mahesh

10
我相信问题是您不是在Web服务器上运行,而是在文件系统上本地运行。我认为,如果您启动一个本地Web服务器,它将可以正常工作,这是有关此主题的一些文章:pearweb.com/javascript/XMLHttpRequest.html developer.mozilla.org/En/Using_XMLHttpRequest “这里要注意的关键是结果状态将成功与0进行比较,而不是200。这是因为文件和ftp方案不使用HTTP结果代码。”
亚当·艾尔斯,

这很棒。特别是当我可以让后端发送状态代码时。
thatmiddleway 2012年

请注意,如果响应是重定向状态(如302),则将提供200
会计师م

52

自己遇到了这个旧问题,寻找相似的解决方案,发现接受的答案是使用的.complete()方法jquery ajax。我在这里引用jquery网站上的通知:

从jQuery 1.8开始不推荐使用jqXHR.success(),jqXHR.error()和jqXHR.complete()回调。要准备将其最终删除的代码,请改用jqXHR.done(),jqXHR.fail()和jqXHR.always()

要了解status codeajax响应,可以使用以下代码:

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

类似地适用于.done().fail()


2
这将返回“未定义”
佩德罗华金

43

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

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

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


41

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

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

所以你不能从响应头重定向的位置301302303307请求。

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


24

您可以检查已响应的内容,只需console.log即可,您将看到whitch属性具有状态码。如果您不懂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
感谢您提供完整功能参数的完整代码,以完成,失败和始终使用。
IvanD '16

4

jqxhr是一个json对象:

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

请参阅: jQuery ajax

所以你会做:

jqxhr.status 获得状态


2

注意:使用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);
  }
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.