¿Cómo obtener el código de estado de respuesta de jQuery.ajax?

Resuelto Mahesh asked hace 13 años • 0 respuestas

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.

Mahesh avatar Mar 18 '11 02:03 Mahesh
Aceptado

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);
    } 
});
Adam Ayres avatar Mar 17 '2011 19:03 Adam Ayres

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 coderespuesta 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()

face avatar Jul 02 '2013 21:07 face

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.

rstackhouse avatar Aug 02 '2012 13:08 rstackhouse

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 statuspropiedad del objeto xhr.

Por lo tanto , no puede obtener la ubicación redirigida desde el encabezado de respuesta de una solicitud 301, o .302303307

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 .

Livingston Samuel avatar Mar 17 '2011 19:03 Livingston Samuel