¿Cómo obtener el código de estado de respuesta de jQuery.ajax?
jquery-1.5 (6)
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>
¿Puede alguien 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.
Cuando su solicitud XHR devuelve una respuesta Redirigir (estado HTTP 301, 302, 303, 307), XMLHttpRequest
sigue automáticamente la URL redirigida y devuelve el código de estado de esa URL .
Puede obtener los códigos de estado sin redireccionamiento (200, 400, 500, etc.) a través de la propiedad de status
del objeto xhr.
Por lo tanto, no puede obtener la ubicación redireccionada del encabezado de respuesta de una solicitud 301
, 302
, 303
o 307
.
Es posible que tenga que cambiar la lógica del servidor para responder de forma que pueda manejar el redireccionamiento, en lugar de dejar que el navegador lo haga. Un ejemplo de implementación .
Encontré este viejo hilo buscando una solución similar y encontré la respuesta aceptada para usar el método .complete()
de jquery ajax
. Cito el aviso en el api.jquery.com/jQuery.ajax aquí:
Las devoluciones de llamada jqXHR.success (), jqXHR.error () y jqXHR.complete () están en desuso a partir de jQuery 1.8. Para preparar su código para su eventual eliminación, use jqXHR.done (), jqXHR.fail () y jqXHR.always () en su lugar.
Para conocer el status code
de status code
de una respuesta ajax, uno puede usar 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 parámetro pasado a la función $ .ajax:
$.ajax({
statusCode: {
500: function(xhr) {
if(window.console) console.log(xhr.responseText);
}
}
});
Sin embargo, como dijo , no es posible detectar los códigos de estado 301 en javascript.
Puede verificar el contenido de su respuesta, solo console.log y verá que la propiedad tiene un código de estado. Si no entiende jsons, consulte el video: https://www.youtube.com/watch?v=Bv_5Zv5c-Ts
Explica los conocimientos básicos que te permiten sentirte más cómodo con javascript.
Puede hacerlo con una versión más corta de la solicitud ajax, consulte el código anterior:
$.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");
});
Ejemplo de salida de consola:
error 403
STATUS: Forbidden
ended
Veo el campo de estado en el objeto jqXhr, aquí hay un violín que 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);
}
});
jqxhr es un objeto json:
devoluciones completas:
El objeto jqXHR (en jQuery 1.4.x, XMLHTTPRequest) y una cadena que categoriza el estado de la solicitud ("success", "notmodified", "error", "timeout", "abort" o "parsererror").
ver: jQuery ajax
entonces lo harías:
jqxhr.status
para obtener el estado