Как получить код статуса ответа от jQuery.ajax?

В следующем коде все, что я пытаюсь сделать, это получить код ответа HTTP из вызова jQuery.ajax. Затем, если код 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="#" onclick="location.href='http://ow.ly/4etPl'; return false;">Test 301 redirect</a>
  <a href="#" onclick="location.href='http://cnn.com/not_found'; return false;">Test 404 not found</a>
</body>
</html>

Может кто-нибудь указать, где я ошибаюсь? Когда я проверяю объект "jqxhr" в Firebug, я не могу найти код состояния или заголовок ответа "Местоположение". Я установил точку останова на последней строке "complete".

Большое спасибо.

Ответ 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);
    } 
});

Ответ 2

Когда ваш запрос XHR возвращает ответ Redirect (HTTP-статус 301, 302, 303, 307), XMLHttpRequest автоматически следует перенаправленному URL-адресу и возвращает код статуса этого URL.

Вы можете получить коды статуса без перенаправления (200, 400, 500 и т.д.) с помощью свойства status объекта xhr.

Таким образом, вы не можете получить перенаправленное местоположение из заголовка ответа запросов 301, 302, 303 или 307.

Возможно, вам придется изменить логику сервера, чтобы ответить так, чтобы вы могли справиться с перенаправлением, вместо того чтобы позволить браузеру это делать. пример реализации.

Ответ 3

Пришел к этому старому потоку, ища аналогичное решение самостоятельно и нашла принятый ответ на использование метода .complete() jquery ajax. Я цитирую уведомление на веб-сайте jquery:

Обратные вызовы jqXHR.success(), jqXHR.error() и jqXHR.complete() устарели по состоянию на jQuery 1.8. Чтобы подготовить код для их возможного удаления, используйте jqXHR.done(), jqXHR.fail() и jqXHR.always().

Чтобы узнать status code ответа ajax, можно использовать следующий код:

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

Аналогично работает для .done() и .fail()

Ответ 4

Вероятно, более идиоматический jQuery должен использовать свойство statusCode объекта параметра, переданного функции $.ajax:

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

Однако, поскольку Livingston Samuel сказал, что невозможно заблокировать 301 код состояния в javascript.

Ответ 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

Ответ 6

jqxhr - объект json:

полная отдача:
jqXHR (в jQuery 1.4.x, XMLHTTPRequest) и строка категоризация статуса запроса (" успех "," немодифицированный "," ошибка "," таймаут "," прервать "или" parsererror").

см: jQuery ajax

чтобы вы сделали:

jqxhr.status, чтобы получить статус