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, и я смог справиться с ошибкой.
disha
61

Вам следует создать карту действий, используя statusCodeнастройку:

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

Ссылка (прокрутите до: 'statusCode')

РЕДАКТИРОВАТЬ (в ответ на комментарии)

Если вам нужно предпринять действия на основе данных, возвращаемых в теле ответа (что мне кажется странным), вам нужно будет использовать error:вместоstatusCode:

error:function (xhr, ajaxOptions, thrownError){
    switch (xhr.status) {
        case 404:
             // Take action, referencing xhr.responseText as needed.
    }
} 
Джордж Камминс
источник
Я пошел по этому пути, но не мог понять, как получить данные. Как получить доступ к телу ответа?
Эндрю
@ Андрей: Почему вам нужен доступ к телу ответа? Ожидаете ли вы, что полезные данные будут возвращены при возникновении ошибки 400 или 500?
Джордж Камминс
Да, я использую код состояния 400 для ошибок проверки формы. (не уверен, уместно это или нет)
Эндрю
В этом случае можете ли вы выполнить соответствующее действие по проверке формы в теле файла 400: function() {. Просто удалите alert () и добавьте необходимый код.
Джордж Камминс
тело ответа содержит 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");
        }
    });
}
CodeWhisperer
источник
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
как бы вы отловили неожиданный код статуса, есть ли в этой версии синтаксиса универсальный обработчик?
joedotnot