Wie erhalte ich den Antwortstatuscode von jQuery.ajax?

229

Im folgenden Code versuche ich nur, den HTTP-Antwortcode von einem jQuery.ajax-Aufruf abzurufen. Wenn der Code dann 301 (permanent verschoben) lautet, zeigen Sie den Antwortheader "Standort" an:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <title>jQuery 301 Trial</title>
  <script src="http://code.jquery.com/jquery-1.5.1.min.js"></script>

  <script type="text/javascript">
  function get_resp_status(url) {
    $.ajax({
      url: url,
      complete: function (jqxhr, txt_status) {
        console.log ("Complete: [ " + txt_status + " ] " + jqxhr);
        // if (response code is 301) {
        console.log ("Location: " + jqxhr.getResponseHeader("Location"));
        // }
      }
    });
  }
  </script>
  <script type="text/javascript">
  $(document).ready(function(){
    $('a').mouseenter(
      function () {
        get_resp_status(this.href);
      },
      function () {
      }
    );
  });
  </script>
</head>
<body>
  <a href="http://ow.ly/4etPl">Test 301 redirect</a>
  <a href="http://cnn.com/not_found">Test 404 not found</a>
</body>
</html>

Kann jemand darauf hinweisen, wo ich falsch liege? Wenn ich das Objekt 'jqxhr' in Firebug überprüfe, kann ich weder den Statuscode noch den Antwortheader 'Location' finden. Ich habe den Haltepunkt in der letzten Zeile von 'complete' gesetzt.

Vielen Dank.

Mahesh
quelle
Ich weiß, dass dies alt ist, aber ich denke, ich habe es gelöst (XHR.responseURL): stackoverflow.com/a/39416846/4946681
Nate

Antworten:

221

Ich sehe das Statusfeld auf dem jqXhr-Objekt. Hier ist eine Geige damit:

http://jsfiddle.net/magicaj/55HQq/3/

$.ajax({
    //...        
    success: function(data, textStatus, xhr) {
        console.log(xhr.status);
    },
    complete: function(xhr, textStatus) {
        console.log(xhr.status);
    } 
});
Adam Ayres
quelle
2
Es scheint in jsFiddle zu funktionieren. Basierend auf dieser und jQuery documentstion sollte xhr.status tun, was ich will. Wenn ich jedoch dasselbe in meinem ursprünglichen Code versuche (txt_status ersetzt durch jqxhr.status), erhalte ich immer wieder jqxhr.status von 0. Hier ist ein Screenshot: twitpic.com/4alsqj
Mahesh
10
Ich glaube, das Problem ist, dass Sie nicht gegen einen Webserver laufen, sondern lokal vom Dateisystem aus. Ich denke, wenn Sie einen lokalen Webserver starten würden, würde dies korrekt funktionieren. Hier sind einige Artikel zu diesem Thema: pearweb.com/javascript/XMLHttpRequest.html developer.mozilla.org/En/Using_XMLHttpRequest "Der Schlüssel, den Sie hier beachten sollten, ist der folgende Der Ergebnisstatus wird für den Erfolg mit 0 verglichen, anstatt mit 200. Dies liegt daran, dass die Datei- und FTP-Schemata keine HTTP-Ergebniscodes verwenden. "
Adam Ayres
das ist toll. Besonders wenn ich mein Backend Statuscodes senden lassen kann.
Thatmiddleway
Beachten Sie, dass, wenn die Antwort ein Weiterleitungsstatus wie 302 ist, dies 200
Buchhalter م
52

Kam über diesen alten Thread und suchte selbst nach einer ähnlichen Lösung und fand die akzeptierte Antwort mit der .complete()Methode von jquery ajax. Ich zitiere den Hinweis auf der jquery-Website hier:

Die Rückrufe jqXHR.success (), jqXHR.error () und jqXHR.complete () sind ab jQuery 1.8 veraltet . Verwenden Sie stattdessen jqXHR.done (), jqXHR.fail () und jqXHR.always (), um Ihren Code für das eventuelle Entfernen vorzubereiten .

Um die status codeAntwort einer Ajax-Antwort zu erfahren , kann der folgende Code verwendet werden:

$.ajax( url [, settings ] )
.always(function (jqXHR) {
    console.log(jqXHR.status);
});

Funktioniert ähnlich für .done()und.fail()

Gesicht
quelle
2
Dies kehrt "undefiniert" zurück
Pedro Joaquín
43

Es ist wahrscheinlich idiomatischer, jQuery zu verwenden, um die statusCode-Eigenschaft des Parameterobjekts zu verwenden, das an die Funktion $ .ajax übergeben wird:

$.ajax({
  statusCode: {
    500: function(xhr) {
      if(window.console) console.log(xhr.responseText);
    }
  }
});

Wie Livingston Samuel sagte, ist es jedoch nicht möglich, 301 Statuscodes in Javascript abzufangen.

rstackhouse
quelle
41

Wenn Ihre XHR-Anforderung eine Umleitungsantwort zurückgibt (HTTP-Status 301, 302, 303, 307), XMLHttpRequest folgt die automatisch der umgeleiteten URL und gibt den Statuscode dieser URL zurück .

Sie können die nicht umleitenden Statuscodes (200, 400, 500 usw.) über die statusEigenschaft des xhr-Objekts abrufen.

So können Sie nicht die umgeleiteten Position aus den Antwort - Header eines bekommen 301, 302, 303oder 307Anfrage.

Möglicherweise müssen Sie Ihre Serverlogik ändern, um so zu reagieren, dass Sie mit der Umleitung umgehen können, anstatt den Browser dies tun zu lassen. Eine beispielhafte Implementierung .

Livingston Samuel
quelle
24

Sie können den Inhalt Ihrer Antwort überprüfen, indem Sie einfach console.log verwenden, und Sie werden sehen, dass die Whitch-Eigenschaft einen Statuscode hat. Wenn Sie jsons nicht verstehen, sehen Sie sich bitte das Video an: https://www.youtube.com/watch?v=Bv_5Zv5c-Ts

Es erklärt sehr grundlegende Kenntnisse, mit denen Sie sich mit Javascript wohler fühlen können.

Sie können dies mit einer kürzeren Version der Ajax-Anfrage tun, siehe Code oben:

$.get("example.url.com", function(data) {
                console.log(data);
            }).done(function() {
               // TO DO ON DONE
            }).fail(function(data, textStatus, xhr) {
                 //This shows status code eg. 403
                 console.log("error", data.status);
                 //This shows status message eg. Forbidden
                 console.log("STATUS: "+xhr);
            }).always(function() {
                 //TO-DO after fail/done request.
                 console.log("ended");
            });

Beispiel für eine Konsolenausgabe:

error 403 
STATUS: Forbidden 
ended
Przemysław Sienkiewicz
quelle
1
Vielen Dank, dass Sie den vollständigen Code für die Verwendung von done, fail und immer mit den vollständigen Funktionsparametern bereitgestellt haben.
IvanD
4

jqxhr ist ein json-Objekt:

vollständige Rückgabe:
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 "Parsererror"). .

siehe: jQuery ajax

so würden Sie tun:

jqxhr.status um den Status zu erhalten

Naftali alias Neal
quelle
2

NB: Verwenden von jQuery 3.4.1

$.ajax({
  url: URL,
  success: function(data, textStatus, jqXHR){
    console.log(textStatus + ": " + jqXHR.status);
    // do something with data
  },
  error: function(jqXHR, textStatus, errorThrown){
    console.log(textStatus + ": " + jqXHR.status + " " + errorThrown);
  }
});
SurfingSanta
quelle