jQuery: Jak uzyskać kod statusu HTTP z metody $ .ajax.error?

81

Używam jQuery do wysyłania żądania AJAX. Chcę wykonywać różne akcje niezależnie od tego, czy kod stanu HTTP jest błędem 400, czy 500. Jak mogę to osiągnąć?

$.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');
        }
    },
});

Aktualizacja:

@GeorgeCummins wspomniał, że praca z treścią odpowiedzi „wydawała się dziwna”. To jest pierwszy raz, kiedy próbuję zrobić coś takiego. Czy moje podejście nie jest najlepszą praktyką? Co byś polecił? Utworzyłem tutaj kolejne pytanie StackOverflow: Jaki kod odpowiedzi / stanu powinienem wysłać na żądanie AJAX, gdy wystąpi błąd weryfikacji użytkownika / formularza?

Andrzej
źródło

Odpowiedzi:

102

Jeśli używasz jQuery 1.5, to statusCode zadziała.

Jeśli używasz jQuery 1.4, spróbuj tego:

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

Powinieneś zobaczyć kod stanu z pierwszego alertu.

Alex Reynolds
źródło
1
Och, widzę mój problem. Myślałam, że databył przekazany do metody błędu, ale w rzeczywistości jqXHR, textStatusierrorThrown
Andrew
5
Podoba mi się twoja odpowiedź, ponieważ wspomniałeś o różnicach między różnymi wersjami jQuery, których na początku nie zauważyłem.
Andrew,
2
Używam twojego przykładu z jQ 2.x i status jest zawsze zerowy (0), textStatus zawsze 'error', a errorthrown jest pusty. Jakieś pomysły? Co zrobiłem: wyłącz serwer po załadowaniu strony, aby dowiedzieć się, co się stanie.
Codebeat
U mnie zadziałało, gdy otrzymałem kod statusu 419 i mogłem obsłużyć błąd.
disha
61

Powinieneś utworzyć mapę działań, korzystając z statusCodeustawienia:

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

Odniesienie (przewiń do: „statusCode”)

EDYTUJ (w odpowiedzi na komentarze)

Jeśli musisz podjąć działanie w oparciu o dane zwrócone w treści odpowiedzi (co wydaje mi się dziwne), error:zamiast tego użyjstatusCode:

error:function (xhr, ajaxOptions, thrownError){
    switch (xhr.status) {
        case 404:
             // Take action, referencing xhr.responseText as needed.
    }
} 
George Cummins
źródło
Zacząłem tę trasę, ale nie mogłem wymyślić, jak zdobyć dane. W jaki sposób uzyskujesz dostęp do treści odpowiedzi?
Andrew,
@Andrew: Dlaczego potrzebujesz dostępu do treści odpowiedzi? Czy spodziewasz się zwrócenia przydatnych danych, gdy wystąpi błąd 400 lub 500?
George Cummins,
Tak, używam kodu stanu 400 w przypadku błędów sprawdzania poprawności formularza. (nie jestem pewien, czy to jest właściwe, czy nie)
Andrew
W takim przypadku, czy możesz wykonać odpowiednią akcję walidacji formularza w treści pliku 400: function() {. Po prostu usuń alert () i dodaj niezbędny kod.
George Cummins,
treść odpowiedzi zawiera kod HTML komunikatów o błędach. Jak mogę uzyskać dostęp do treści żądania z poziomu 400: function() {?
Andrew,
10

Innym rozwiązaniem jest użycie funkcji response.status. To da ci status http, który jest zwracany przez wywołanie 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
źródło
8

posługiwać się

   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');
   }
  }

});
geneza
źródło
2
jak można złapać nieoczekiwany kod statusu, czy w tej wersji składni jest procedura obsługi catch-all lub else?
joedotnot