jQuery: Wie erhalte ich den HTTP-Statuscode aus der Methode $ .ajax.error?

79

Ich verwende jQuery, um eine AJAX-Anfrage zu stellen. Ich möchte verschiedene Aktionen ausführen, unabhängig davon, ob der HTTP-Statuscode ein 400-Fehler oder ein 500-Fehler ist. Wie kann ich das erreichen?

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

Aktualisieren:

@ GeorgeCummins erwähnte, dass es "seltsam" schien, mit dem Antwortkörper zu arbeiten. Dies ist das erste Mal, dass ich versucht habe, so etwas zu tun. Ist mein Ansatz keine Best Practice? Was würden Sie empfehlen? Ich habe hier eine weitere StackOverflow-Frage erstellt: Welchen Antwort- / Statuscode soll ich an eine AJAX-Anfrage senden, wenn ein Benutzer- / Formularüberprüfungsfehler vorliegt?

Andrew
quelle

Antworten:

101

Wenn Sie jQuery 1.5 verwenden, statusCodefunktioniert dies.

Wenn Sie jQuery 1.4 verwenden, versuchen Sie Folgendes:

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

Sie sollten den Statuscode ab der ersten Warnung sehen.

Alex Reynolds
quelle
1
Oh, ich sehe mein Problem. Ich dachte , dass datazu der Fehler - Methode übergeben wurde, aber es ist eigentlich jqXHR, textStatusunderrorThrown
Andrew
5
Ich mag Ihre Antwort, weil Sie die Unterschiede zwischen den verschiedenen Versionen von jQuery erwähnen, die ich zuerst nicht bemerkt habe.
Andrew
2
Ich verwende Ihr Beispiel bei jQ 2.x und der Status ist immer Null (0), textStatus ist immer 'error' und errorthrown ist leer. Irgendwelche Ideen? Was ich getan habe: Schalten Sie den Server aus, nachdem die Seite geladen wurde, um herauszufinden, was passiert.
Codebeat
Es hat bei mir funktioniert, als ich den Statuscode 419 bekam und den Fehler behandeln konnte.
Disha
61

Sie sollten eine Aktionskarte mit der folgenden statusCodeEinstellung erstellen :

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

Referenz (Scrollen Sie zu: 'statusCode')

EDIT (als Antwort auf Kommentare)

Wenn Sie basierend auf den im Antworttext zurückgegebenen Daten Maßnahmen ergreifen müssen (was mir seltsam erscheint), müssen Sie error:stattdessen verwendenstatusCode:

error:function (xhr, ajaxOptions, thrownError){
    switch (xhr.status) {
        case 404:
             // Take action, referencing xhr.responseText as needed.
    }
} 
George Cummins
quelle
Ich bin diesen Weg gegangen, konnte aber nicht herausfinden, wie ich an die Daten komme. Wie greifen Sie auf den Antworttext zu?
Andrew
@ Andrew: Warum müssen Sie auf den Antworttext zugreifen? Erwarten Sie, dass nützliche Daten zurückgegeben werden, wenn ein 400- oder 500-Fehler auftritt?
George Cummins
Ja, ich verwende einen Statuscode von 400 für Fehler bei der Formularüberprüfung. (nicht sicher, ob das angemessen ist oder nicht)
Andrew
In diesem Fall können Sie die entsprechende Formularüberprüfungsaktion im Hauptteil des ausführen 400: function() {. Entfernen Sie einfach die Warnung () und fügen Sie den erforderlichen Code hinzu.
George Cummins
Der Antworttext enthält das HTML der Fehlermeldungen. Wie kann ich innerhalb von auf den 400: function() {Anfragetext zugreifen ?
Andrew
10

Eine andere Lösung ist die Verwendung der Funktion response.status. Dadurch erhalten Sie den http-Status, der vom Ajax-Aufruf zurückgegeben wird.

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

verwenden

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

});
Genesis
quelle
2
Wie würden Sie einen unerwarteten statusCode abfangen? Gibt es in dieser Version der Syntax einen Catch-All- oder einen anderen Handler?
Joedotnot