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

问题描述 投票:0回答:7

在下面的代码中,我想做的就是从 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://0w.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
7个回答
272
投票

我看到 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);
    } 
});

59
投票

我自己遇到了这个旧线程,寻找类似的解决方案,并发现接受的答案是使用

.complete()
jquery ajax
方法。我在这里引用jquery网站上的通知:

从 jQuery 1.8 开始,

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

要了解ajax响应的

status code

,可以使用以下代码:

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

对于

.done()

.fail()
 的工作原理类似
    


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

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

但是,正如

Livingston Samuel 所说,在 javascript 中不可能捕获 301 状态代码。


43
投票
当您的 XHR 请求返回重定向响应(HTTP 状态 301、302、303、307)时,

XMLHttpRequest

 
自动遵循重定向的 URL 并返回该 URL 的状态代码

您可以通过 xhr 对象的

status

 属性获取非重定向状态代码(200、400、500 等)。

因此您无法从

301

302
303
307
 请求的响应标头获取重定向位置。

您可能必须更改服务器逻辑,以便以可以处理重定向的方式进行响应,而不是让浏览器执行此操作。

示例实现


35
投票
你可以检查你的响应内容,只需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
    

20
投票
注意:使用 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 对象:

完整返回:

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

参见:

jQuery ajax

所以你会这样做:

jqxhr.status

获取状态

© www.soinside.com 2019 - 2024. All rights reserved.