¿Cómo obtener el código de estado de respuesta de jQuery.ajax?
En el siguiente código, todo lo que intento hacer es obtener el código de respuesta HTTP de una llamada jQuery.ajax. Luego, si el código es 301 (Movido permanentemente), muestre el encabezado de respuesta 'Ubicación':
<?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>
¿Alguien puede señalar dónde me estoy equivocando? Cuando reviso el objeto 'jqxhr' en Firebug, no puedo encontrar el código de estado ni el encabezado de respuesta 'Ubicación'. Establecí el punto de interrupción en la última línea de "completo".
Muchas gracias.
Veo el campo de estado en el objeto jqXhr, aquí hay un juguete sobre cómo funciona:
http://jsfiddle.net/magicaj/55HQq/3/
$.ajax({
//...
success: function(data, textStatus, xhr) {
console.log(xhr.status);
},
complete: function(xhr, textStatus) {
console.log(xhr.status);
}
});
Encontré este antiguo hilo buscando una solución similar y descubrí que la respuesta aceptada era usar el .complete()
método de jquery ajax
. Cito el aviso en el sitio web de jquery aquí:
Las devoluciones de llamada jqXHR.success(), jqXHR.error() y jqXHR.complete() están obsoletas a partir de jQuery 1.8. Para preparar su código para su eventual eliminación, utilice jqXHR.done(), jqXHR.fail() y jqXHR.always() en su lugar.
Para conocer la status code
respuesta de ajax, se puede utilizar el siguiente código:
$.ajax( url [, settings ] )
.always(function (jqXHR) {
console.log(jqXHR.status);
});
Funciona de manera similar para .done()
y.fail()
Probablemente sea más idiomático jQuery usar la propiedad statusCode del objeto de parámetro pasado a la función $.ajax:
$.ajax({
statusCode: {
500: function(xhr) {
if(window.console) console.log(xhr.responseText);
}
}
});
Sin embargo, como dijo Livingston Samuel , no es posible detectar códigos de estado 301 en javascript.
Cuando su solicitud XHR devuelve una respuesta de redireccionamiento (estado HTTP 301, 302, 303, 307), XMLHttpRequest
automáticamente sigue la URL redirigida y devuelve el código de estado de esa URL .
Puede obtener los códigos de estado que no son de redireccionamiento (200, 400, 500, etc.) a través de la status
propiedad del objeto xhr.
Por lo tanto , no puede obtener la ubicación redirigida desde el encabezado de respuesta de una solicitud 301
, o .302
303
307
Es posible que tengas que cambiar la lógica de tu servidor para responder de manera que puedas manejar la redirección, en lugar de dejar que el navegador lo haga. Una implementación de ejemplo .