Wie erhalte ich den HTTP-Statuscode mit jQuery?

74

Ich möchte überprüfen, ob eine Seite den Statuscode 401 zurückgibt. Ist dies möglich?

Hier ist mein Versuch, aber er gibt nur 0 zurück.

$.ajax({
    url: "http://my-ip/test/test.php",
    data: {},
    complete: function(xhr, statusText){
    alert(xhr.status); 
    }
});
horgen
quelle
Überprüfen Sie statusTextstattdessen den Wert des zweiten Parameters für die Rückruffunktion.
Jimmy Cuadra
1
Dies warnt "Autorisierung erforderlich". Ich kann damit arbeiten, aber ein 401-Alarm wäre besser;)
horgen

Antworten:

96

Dies ist mit der jQuery- $.ajax()Methode möglich

$.ajax(serverUrl, {
   type: OutageViewModel.Id() == 0 ? "POST" : "PUT",
   data: dataToSave,
   statusCode: {
      200: function (response) {
         alert('1');
         AfterSavedAll();
      },
      201: function (response) {
         alert('1');
         AfterSavedAll();
      },
      400: function (response) {
         alert('1');
         bootbox.alert('<span style="color:Red;">Error While Saving Outage Entry Please Check</span>', function () { });
      },
      404: function (response) {
         alert('1');
         bootbox.alert('<span style="color:Red;">Error While Saving Outage Entry Please Check</span>', function () { });
      }
   }, success: function () {
      alert('1');
   },
});
Ravi Mittal
quelle
24
Ändern Sie also die 400 in eine 401.
Mike Chamberlain
@StuckBetweenTrees Was macht es aus?
Superheld
Beachten Sie, dass der Parameter Code 200 (erledigt) Daten sind, während andere (fehlgeschlagen) jqXHR sind
Nick Tsai
67

Das dritte Argument ist das XMLHttpRequest-Objekt, sodass Sie tun können, was Sie wollen.

$.ajax({
  url  : 'http://example.com',
  type : 'post',
  data : 'a=b'
}).done(function(data, statusText, xhr){
  var status = xhr.status;                //200
  var head = xhr.getAllResponseHeaders(); //Detail header info
});
b123400
quelle
Es gibt Folgendes zurück: XMLHttpRequest kann example.com nicht laden . In der angeforderten Ressource ist kein Header 'Access-Control-Allow-Origin' vorhanden. Origin ' stackoverflow.com ' ist daher kein Zugriff gestattet.
Sidney
Sie müssen die CORS-Behandlung aktivieren, um das Problem "Zugriffskontrolle-Zulassen-Ursprung" zu beseitigen. Abhängig von der Art des Projekts, mit dem Sie sich befassen, können Sie dies möglicherweise nicht einfach beheben, insbesondere wenn sich die API in einer anderen Domäne befindet und keine domänenübergreifenden Anforderungen
zulässig sind
@Annjawn Wie man mit CORS umgeht, als ob ich denselben API-Aufruf mit PHP mache, gibt es keinen Fehler von CORS, aber wenn ich Ajax für denselben API-Aufruf war, gebe ich einen Fehler von CORS. Bitte lassen Sie es mich wissen
MD Shahrouq
2
Dies wird nicht funktionieren, wenn der Statuscode 400 ist (und wahrscheinlich für andere Codes, die nicht 200 sind)
AndroidDev
20

Verwenden Sie den Fehlerrückruf.

Zum Beispiel:

jQuery.ajax({'url': '/this_is_not_found', data: {}, error: function(xhr, status) {
    alert(xhr.status); }
});

Alarmiert 404

baloo
quelle
in der Tat tat es. Ich bin ein bisschen neu bei jQuery. Aber was ist mit dem 401-Status? Wie speichere ich den Status in einer Variablen? o_O
horgen
Es wird 401 auf die gleiche Weise anzeigen. Was genau möchten Sie mit dem Fehler machen?
Baloo
Wenn 401 Benutzer nicht auf diese Seite senden. Der Fehler warnt nur, wenn die Seite nicht gefunden wird (404)
horgen
Getestet in Firefox, wo es auch 401 gefangen hat, vielleicht gilt dies nicht für alle Browser
baloo
10

Ich denke, Sie sollten auch die Fehlerfunktion der $ .ajax- Methode implementieren .

error (XMLHttpRequest, textStatus, errorThrown) Funktion

Eine Funktion, die aufgerufen werden soll, wenn die Anforderung fehlschlägt. Der Funktion werden drei Argumente übergeben: Das XMLHttpRequest-Objekt, eine Zeichenfolge, die den aufgetretenen Fehlertyp beschreibt, und ein optionales Ausnahmeobjekt, falls eines aufgetreten ist. Mögliche Werte für das zweite Argument (neben null) sind "timeout", "error", "notmodified" und "parsererror".

$.ajax({
    url: "http://my-ip/test/test.php",
    data: {},
    complete: function(xhr, statusText){
        alert(xhr.status); 
    },
    error: function(xhr, statusText, err){
        alert("Error:" + xhr.status); 
    }
});
GvS
quelle
3
thx, aber complete gibt nur 0 zurück. Ist es möglich, den 401-Code zu erhalten?
Horgen
Sind Sie sicher, dass complete aufgerufen wird, wenn ein HTTP 401 (nicht autorisiert) vom Server zurückgegeben wird? Ich habe nicht getestet, aber ich würde erwarten, dass Fehler aufgerufen wird.
GvS
complete Typ: Funktion (jqXHR jqXHR, String textStatus) Eine Funktion, die aufgerufen wird, wenn die Anforderung beendet ist (nachdem erfolgreiche und fehlerhafte Rückrufe ausgeführt wurden). Der Funktion werden zwei Argumente übergeben: Das Objekt jqXHR (in jQuery 1.4.x, XMLHTTPRequest) und eine Zeichenfolge, die den Status der Anforderung kategorisiert ("Erfolg", "Nicht geändert", "Fehler", "Zeitüberschreitung", "Abbruch" oder "Parser Fehler"). Ab jQuery 1.5 kann die vollständige Einstellung eine Reihe von Funktionen akzeptieren. Jede Funktion wird nacheinander aufgerufen. Dies ist ein Ajax-Ereignis.
Pshirishreddy
8

Ich habe diese Lösung gefunden, bei der Sie einfach den Server-Antwortcode mithilfe des Statuscodes überprüfen können .

Beispiel:

$.ajax({
type : "POST",
url : "/package/callApi/createUser",
data : JSON.stringify(data),
contentType: "application/json; charset=UTF-8",
success: function (response) {  
    alert("Account created");
},
statusCode: {
    403: function() {
       // Only if your server returns a 403 status code can it come in this block. :-)
        alert("Username already exist");
    }
},
error: function (e) {
    alert("Server error - " + e);
} 
});
Jigar Trivedi
quelle
2
Wenn die Antwort nicht erfolgreich ist und der Antwortstatuscode nicht einmal 403 ist, geht sie zum Fehlerblock.
Jigar Trivedi
6
$.ajax({
    url: "http://my-ip/test/test.php",
    data: {},
    error: function(xhr, statusText, errorThrown){alert(xhr.status);}
});
vartec
quelle
3

Ich kapsle den jQuery Ajax in eine Methode:

var http_util = function (type, url, params, success_handler, error_handler, base_url) {

    if(base_url) {
        url = base_url + url;
    }

    var success = arguments[3]?arguments[3]:function(){};
    var error = arguments[4]?arguments[4]:function(){};



    $.ajax({
        type: type,
        url: url,
        dataType: 'json',
        data: params,
        success: function (data, textStatus, xhr) {

            if(textStatus === 'success'){
                success(xhr.code, data);   // there returns the status code
            }
        },
        error: function (xhr, error_text, statusText) {

            error(xhr.code, xhr);  // there returns the status code
        }
    })

}

Verwendung:

http_util('get', 'http://localhost:8000/user/list/', null, function (status_code, data) {
    console(status_code, data)
}, function(status_code, err){
    console(status_code, err)
})
Flugzeug
quelle
1

Ich hatte große Probleme damit, dass Ajax + jQuery v3 sowohl den Antwortstatuscode als auch Daten von JSON-APIs abruft. jQuery.ajax decodiert JSON-Daten nur, wenn der Status erfolgreich ist, und vertauscht je nach Statuscode die Reihenfolge der Rückrufparameter. Ugghhh.

Der beste Weg, dies zu bekämpfen, besteht darin, die .alwaysKettenmethode aufzurufen und ein wenig aufzuräumen. Hier ist mein Code.

$.ajax({
        ...
    }).always(function(data, textStatus, xhr) {
        var responseCode = null;
        if (textStatus === "error") {
            // data variable is actually xhr
            responseCode = data.status;
            if (data.responseText) {
                try {
                    data = JSON.parse(data.responseText);
                } catch (e) {
                    // Ignore
                }
            }
        } else {
            responseCode = xhr.status;
        }

        console.log("Response code", responseCode);
        console.log("JSON Data", data);
    });
Phil
quelle
0

Test in WAMP SERVER apache2

abrir el httpd.conf y acceptgar esto:

<IfModule mod_headers.c>
  Header set Access-Control-Allow-Origin "*"
</IfModule>

Aktivieren Sie das nächste Modul in Apache headers_module

Starten Sie alle Dienste neu

Jose Miguel
quelle
Willkommen bei StackOverflow :-) Bitte antworten Sie nur auf Englisch und fügen Sie ein oder zwei Sätze hinzu, warum Ihr Vorschlag funktionieren könnte.
Gogowitsch