Як отримати код статусу відповіді від 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, я не можу знайти код стану, ані заголовок відповіді 'Місцезнаходження'. Я встановлюю точку перерви в останньому рядку "завершено".

Велике спасибі



Я знаю , що це старий, але я думаю , що я вирішив її (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 codeajax, можна використовувати наступний код:

$.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 повертає відповідь на переспрямування (HTTP Status 301, 302, 303, 307), XMLHttpRequest автоматично слідує за перенаправленою URL-адресою та повертає код статусу цієї URL-адреси .

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

Таким чином , ви не можете отримати перенаправлені розташування з заголовка відгуку 301, 302, 303або 307запит.

Можливо, вам доведеться змінити логіку сервера, щоб відповісти таким чином, щоб ви могли обробляти переадресацію, а не дозволяти браузеру це робити. Приклад реалізації .


24

Ви можете перевірити вміст відповіді, просто console.log його, і ви побачите, у якого властивості є код статусу. Якщо ви не розумієте 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
Дякуємо, що надали повний код того, як використовувати виконане, невдале та завжди з повними параметрами функції.
ІванД

4

jqxhr - об’єкт json:

Повна віддача:
об'єкт jqXHR (в jQuery 1.4.x, XMLHTTPRequest) та рядок, що класифікує статус запиту ("успіх", "немодифікований", "помилка", "час очікування", "перервати" або "парсерор") .

див .: jQuery ajax

так що ви зробите:

jqxhr.status щоб отримати статус


2

Примітка: Використання 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.