Как получить код статуса ответа от 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.