Come ottenere il codice di stato della risposta da jQuery.ajax?


230

Nel seguente codice, tutto quello che sto cercando di fare è ottenere il codice di risposta HTTP da una chiamata jQuery.ajax. Quindi, se il codice è 301 (spostato in modo permanente), visualizza l'intestazione della risposta "Posizione":

<?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>

Qualcuno può indicare dove sto sbagliando? Quando controllo l'oggetto "jqxhr" in Firebug, non riesco a trovare il codice di stato, né l'intestazione della risposta "Posizione". Ho impostato il punto di interruzione sull'ultima riga di "completo".

Grazie mille



So che questo è vecchio, ma penso che ho risolto (XHR.responseURL): stackoverflow.com/a/39416846/4946681
Nate

Risposte:


221

Vedo il campo di stato sull'oggetto jqXhr, ecco un violino che funziona:

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

$.ajax({
    //...        
    success: function(data, textStatus, xhr) {
        console.log(xhr.status);
    },
    complete: function(xhr, textStatus) {
        console.log(xhr.status);
    } 
});

2
Sembra funzionare in jsFiddle. Sulla base di questo e della documentazione jQuery, xhr.status dovrebbe fare quello che voglio. Tuttavia, quando provo lo stesso nel mio codice originale (txt_status sostituito con jqxhr.status), continuo a ricevere jqxhr.status di 0. Ecco uno screenshot: twitpic.com/4alsqj
Mahesh

10
Credo che il problema sia che non si esegue un server Web ma localmente dal file system. Penso che se avessi acceso un server web locale questo avrebbe funzionato correttamente, ecco alcuni articoli sull'argomento: pearweb.com/javascript/XMLHttpRequest.html developer.mozilla.org/En/Using_XMLHttpRequest "La cosa chiave da notare qui è che lo stato del risultato viene confrontato con 0 per il successo invece di 200. Questo perché gli schemi file e ftp non usano i codici risultato HTTP. "
Adam Ayres,

è fantastico Soprattutto quando posso chiedere al mio backend di inviare codici di stato.
via del

Si noti che se la risposta è uno stato di reindirizzamento come 302, questo darà 200
Ragioniere

52

Mi sono imbattuto in questo vecchio thread alla ricerca di una soluzione simile e ho trovato la risposta accettata utilizzando il .complete()metodo di jquery ajax. Cito l'avviso sul sito Web di jquery qui:

Il jqXHR.success (), jqXHR.error (), e jqXHR.complete () callback sono obsoleti come di jQuery 1.8. Per preparare il codice per la loro eventuale rimozione, utilizzare invece jqXHR.done (), jqXHR.fail () e jqXHR.always () .

Per conoscere la status coderisposta ajax, è possibile utilizzare il seguente codice:

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

Funziona in modo simile per .done()e.fail()


2
Questo sta tornando "indefinito"
Pedro Joaquín il

43

Probabilmente è più idiomatico jQuery usare la proprietà statusCode dell'oggetto parametro passato alla funzione $ .ajax:

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

Tuttavia, come ha detto Livingston Samuel , non è possibile catturare 301 codici di stato in javascript.


41

Quando la tua richiesta XHR restituisce una risposta di reindirizzamento (Stato HTTP 301, 302, 303, 307), XMLHttpRequest segue automaticamente l'URL reindirizzato e restituisce il codice di stato di tale URL .

È possibile ottenere i codici di stato senza reindirizzamento (200, 400, 500 ecc.) Tramite la statusproprietà dell'oggetto xhr.

Così non si può ottenere la posizione reindirizzato dalla intestazione di risposta di un 301, 302, 303o 307richiesta.

Potrebbe essere necessario modificare la logica del server per rispondere in modo da poter gestire il reindirizzamento, anziché consentire al browser di farlo. Un'implementazione di esempio .


24

Puoi controllare il tuo contenuto di respone, basta console.log e vedrai che la proprietà whitch ha un codice di stato. Se non capisci jsons, fai riferimento al video: https://www.youtube.com/watch?v=Bv_5Zv5c-Ts

Spiega conoscenze di base che ti fanno sentire più a tuo agio con JavaScript.

Puoi farlo con una versione più breve della richiesta Ajax, vedi il codice sopra:

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

Esempio di output della console:

error 403 
STATUS: Forbidden 
ended

1
Grazie per aver fornito il codice completo di come usare fatto, fallito e sempre, con parametri di funzione completi.
IvanD

4

jqxhr è un oggetto json:

ritorni completi:
l'oggetto jqXHR (in jQuery 1.4.x, XMLHTTPRequest) e una stringa che categorizza lo stato della richiesta ("esito positivo", "non modificato", "errore", "timeout", "abort" o "parsererror") .

vedi: jQuery ajax

quindi faresti:

jqxhr.status per ottenere lo stato


2

NB: utilizzo di 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);
  }
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.