jQuery: Як отримати код стану HTTP із методу $ .ajax.error?


81

Я використовую jQuery, щоб зробити запит AJAX. Я хочу виконувати різні дії, незалежно від того, чи є код стану HTTP помилкою 400 чи помилкою 500. Як я можу цього досягти?

$.ajax({
    type: 'POST',
    url: '/controller/action',
    data: $form.serialize(),
    success: function(data){
        alert('horray! 200 status code!');
    },
    error: function(data){
        //get the status code
        if (code == 400) {
            alert('400 status code! user error');
        }
        if (code == 500) {
            alert('500 status code! server error');
        }
    },
});

Оновлення:

@GeorgeCummins згадав, що "здається дивним" працювати з тілом відповіді. Це вперше я намагався робити подібні речі. Чи мій підхід не є найкращою практикою? Що б ви порекомендували? Я створив ще одне запитання StackOverflow для цього тут: Який код відповіді / стану я повинен відправити на запит AJAX, коли виникає помилка перевірки користувача / форми?

Відповіді:


102

Якщо ви використовуєте jQuery 1.5, тоді це statusCodeбуде працювати.

Якщо ви використовуєте jQuery 1.4, спробуйте наступне:

error: function(jqXHR, textStatus, errorThrown) {
    alert(jqXHR.status);
    alert(textStatus);
    alert(errorThrown);
}

Ви повинні побачити код стану з першого попередження.


1
О, я бачу свою проблему. Я думав , що dataв даний час передається методу помилок, але це на самому справі jqXHR, textStatusіerrorThrown
Andrew

5
Мені подобається ваша відповідь, тому що ви згадали про відмінності між різними версіями jQuery, яких я спочатку не помітив.
Ендрю

2
Я використовую ваш приклад у jQ 2.x, а статус завжди дорівнює нулю (0), textStatus завжди 'error' і errorthrown порожній. Будь-які ідеї? Що я зробив: Поверніть сервер після завантаження сторінки, щоб зрозуміти, що сталося.
Codebeat

Це спрацювало для мене, коли я отримав код стану 419, і я міг усунути помилку.
Діша

61

Вам слід створити карту дій, використовуючи statusCodeналаштування:

$.ajax({
  statusCode: {
    400: function() {
      alert('400 status code! user error');
    },
    500: function() {
      alert('500 status code! server error');
    }
  }
});

Посилання (прокрутіть до: 'statusCode')

EDIT (у відповідь на коментарі)

Якщо вам потрібно вжити заходів на основі даних, що повертаються в тілі відповіді (що мені здається дивним), вам потрібно буде використовувати error:замістьstatusCode:

error:function (xhr, ajaxOptions, thrownError){
    switch (xhr.status) {
        case 404:
             // Take action, referencing xhr.responseText as needed.
    }
} 

Я пішов цим шляхом, але не міг зрозуміти, як отримати дані. Як отримати доступ до тіла відповіді?
Ендрю

@Andrew: Навіщо вам потрібен доступ до тіла відповіді? Ви очікуєте повернення корисних даних, коли виникає помилка 400 або 500?
Джордж Каммінс,

Так, я використовую код стану 400 для помилок перевірки форми. (не впевнений, чи це доречно чи ні)
Ендрю

У такому випадку, чи можете ви виконати відповідну дію перевірки форми в тілі 400: function() {. Просто видаліть попередження () і додайте необхідний код.
Джордж Каммінс,

тіло відповіді містить html повідомлень про помилки. Як я можу отримати доступ до тіла запиту зсередини 400: function() {?
Ендрю

10

Іншим рішенням є використання функції response.status. Це дасть вам статус http, який повертається викликом ajax.

function checkHttpStatus(url) {     
    $.ajax({
        type: "GET",
        data: {},
        url: url,
        error: function(response) {
            alert(url + " returns a " + response.status);
        }, success() {
            alert(url + " Good link");
        }
    });
}

8

використання

   statusCode: {
    404: function() {
      alert('page not found');
    }
  }

-

$.ajax({
    type: 'POST',
    url: '/controller/action',
    data: $form.serialize(),
    success: function(data){
        alert('horray! 200 status code!');
    },
    statusCode: {
    404: function() {
      alert('page not found');
    },

    400: function() {
       alert('bad request');
   }
  }

});

2
як би ви впіймали несподіваний statusCode, чи є в цій версії синтаксису обробник catch-all або ще?
joedotnot
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.