Как получить код статуса ответа от jQuery.ajax? - PullRequest
203 голосов
/ 17 марта 2011

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

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

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

Ответы [ 6 ]

197 голосов
/ 17 марта 2011

Я вижу поле состояния на объекте 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);
    } 
});
46 голосов
/ 03 июля 2013

Наткнулся на эту старую ветку в поисках аналогичного решения и обнаружил, что принятый ответ использует .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()

41 голосов
/ 17 марта 2011

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

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

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

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

37 голосов
/ 02 августа 2012

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

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

Однако, как сказал Ливингстон Самуэль ,невозможно поймать 301 кодов состояния в JavaScript.

16 голосов
/ 26 октября 2016

Вы можете проверить ваш ответный контент, просто 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
3 голосов
/ 17 марта 2011

jqxhr - это объект json:

complete:Объект jqXHR (в jQuery 1.4.x, XMLHTTPRequest) и строка, классифицирующая статус запроса («успех», «немодифицированный», «ошибка», «время ожидания», «прерывание» или «parsererror»).

см .: jQuery ajax

, поэтому вы должны сделать:

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

...