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


230

В следующем коде все, что я пытаюсь сделать, это получить код ответа 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».

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



Я знаю , что это старый, но я думаю , что я решил ее (XHR.responseURL): stackoverflow.com/a/39416846/4946681
— Нейт

Ответы:


221

Я вижу поле состояния на объекте 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
Вроде бы работает в jsFiddle. Исходя из этого и документации jQuery, xhr.status должен делать то, что я хочу. Однако, когда я пытаюсь сделать то же самое в моем исходном коде (txt_status заменен на jqxhr.status), я продолжаю получать jqxhr.status, равный 0. Вот скриншот: twitpic.com/4alsqj
— Mahesh

10
Я считаю, что проблема заключается в том, что вы работаете не с веб-сервером, а локально из файловой системы. Я думаю, что если вы запустили локальный веб-сервер, это будет работать правильно, вот несколько статей на эту тему: pearweb.com/javascript/XMLHttpRequest.html developer.mozilla.org/En/Using_XMLHttpRequest «Ключевым моментом здесь является то, что статус результата сравнивается с 0 для успеха вместо 200. Это потому, что схемы файла и ftp не используют коды результата HTTP ".
— Адам Айрес

это круто. Особенно, когда мой бэкэнд может отправлять коды состояния.
— полпути

Обратите внимание, что если ответ имеет статус перенаправления, например 302, это даст 200
— Бухгалтер م

52

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


2
Это возвращает «неопределенный»
— Педро Хоакин

43

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

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

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


41

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

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

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

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


24

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

1
Спасибо за предоставление полного кода о том, как использовать done, fail и всегда с полными функциональными параметрами.
— IvanD

4

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

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

смотрите: jQuery ajax

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

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


2

NB. Использование 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);
  }
});
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.