2011-03-17 14 views
159

Nel codice seguente, 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), visualizzare il 'Luogo' intestazione della risposta:Come ottenere il codice di stato della risposta da jQuery.ajax?

<?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 andando male? Quando controllo l'oggetto 'jqxhr' in Firebug, non riesco a trovare il codice di stato, né l'intestazione di risposta 'Location'. Ho impostato il punto di interruzione sull'ultima riga di "completa".

Grazie mille.

+1

https://api.jquery.com/jQuery.ajax/ – ehsan

+0

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

risposta

157

vedo il campo di stato sull'oggetto jqXhr, ecco un violino con esso di lavoro:

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 che funzioni in jsFiddle. Sulla base di quella e della documentazione di jQuery, xhr.status dovrebbe fare ciò che voglio. Tuttavia, quando provo lo stesso nel mio codice originale (txt_status sostituito con jqxhr.status), continuo a ottenere jqxhr.status di 0. Ecco uno screenshot: http://twitpic.com/4alsqj – Mahesh

+9

Credo che tu sia il problema non funziona contro un server Web ma localmente dal file system. Penso che se hai attivato un server web locale questo funzionerebbe correttamente, ecco alcuni articoli sull'argomento: http://www.pearweb.com/javascript/XMLHttpRequest.html https://developer.mozilla.org/En/ Using_XMLHttpRequest "La cosa fondamentale da notare qui è che lo stato del risultato viene confrontato con 0 per il successo anziché 200. Questo perché gli schemi di file e ftp non usano i codici di risultato HTTP." –

+0

questo è fantastico. Soprattutto quando posso avere il mio backend inviare codici di stato. – thatmiddleway

2

jqxhr è un oggetto JSON: ritorna

complete:
L'oggetto jqXHR (in jQuery 1.4.x, XMLHTTPRequest) e una stringa che classifica lo stato della richiesta ("success", "notmodified", "error", "timeout", "abort" o "parsererror").

vedi: jQuery ajax

così si farebbe:

jqxhr.status per ottenere lo stato

36

Quando la richiesta XHR restituisce una risposta di reindirizzamento (stato HTTP 301, 302, 303, 307), XMLHttpRequestautomatically follows the redirected URL and returns the status code of that URL.

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

quindi non è possibile ottenere la posizione reindirizzato dalla intestazione di risposta di una richiesta 301, 302, 303 o 307.

Potrebbe essere necessario modificare la logica del server per rispondere in modo da poter gestire il reindirizzamento, piuttosto che consentire al browser di farlo. An example implementation.

30

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

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

Tuttavia, come detto Livingston Samuel, non è possibile per la cattura di 301 codici di stato in javascript.

35

Si è imbattuto in questo thread precedente alla ricerca di una soluzione simile e ho trovato che la risposta accettata utilizzava il metodo .complete() di jquery ajax. Cito la comunicazione concernente jquery website qui:

Il jqXHR.success(), jqXHR.error(), e jqXHR.complete() le richiamate sono deprecate a partire da jQuery 1.8. Per preparare il codice per la loro eventuale rimozione, utilizzare invece jqXHR.done(), jqXHR.fail() e jqXHR.always().

a conoscere i status code di una risposta Ajax, si può utilizzare il seguente codice:

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

Opere similmente per .done() e .fail()

6

È possibile verificare il contenuto respone, basta console.log e vedrai le proprietà di whitch avere un codice di stato. Se non capisci i jsons, fai riferimento al video: https://www.youtube.com/watch?v=Bv_5Zv5c-Ts

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

Puoi farlo con la versione più corta della richiesta AJAX, si prega di consultare il codice di cui 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"); 
      }); 

output della console Esempio:

error 403 
STATUS: Forbidden 
ended 
+1

Grazie per aver fornito il codice completo su come utilizzare fatto, fallire e sempre, con parametri di funzione completi. – IvanD

Problemi correlati