jQuery: ¿Cómo obtener el código de estado HTTP desde el método $ .ajax.error?


81

Estoy usando jQuery para hacer una solicitud AJAX. Quiero realizar diferentes acciones, ya sea que el código de estado HTTP sea un error 400 o un error 500. ¿Cómo puedo conseguir esto?

$.ajax({
    type: 'POST',
    url: '/controller/action',
    data: $form.serialize(),
    success: function(data){
        alert('horray! 200 status code!');
    },
    error: function(data){
        //get the status code
        if (code == 400) {
            alert('400 status code! user error');
        }
        if (code == 500) {
            alert('500 status code! server error');
        }
    },
});

Actualizar:

@GeorgeCummins mencionó que "parecía extraño" trabajar con el cuerpo de respuesta. Esta es la primera vez que intento hacer este tipo de cosas. ¿Mi enfoque no es una buena práctica? ¿Qué recomendarías? Creé otra pregunta de StackOverflow para esto aquí: ¿Qué código de respuesta / estado debo enviar a una solicitud AJAX cuando hay un error de validación de usuario / formulario?

Respuestas:


102

Si está utilizando jQuery 1.5, statusCodefuncionará.

Si está utilizando jQuery 1.4, intente esto:

error: function(jqXHR, textStatus, errorThrown) {
    alert(jqXHR.status);
    alert(textStatus);
    alert(errorThrown);
}

Debería ver el código de estado de la primera alerta.


1
Oh, veo mi problema. Estaba pensando que dataestaba siendo pasa al método de error, pero en realidad jqXHR, textStatusyerrorThrown
Andrew

5
Me gusta tu respuesta porque mencionas las diferencias entre las diferentes versiones de jQuery, que no noté al principio.
Andrew

2
Estoy usando su ejemplo en jQ 2.xy el estado siempre es cero (0), textStatus siempre es 'error' y errorthrown está vacío. ¿Algunas ideas? Lo que he hecho: Apague el servidor después de que se cargue la página para averiguar qué sucede.
Codebeat

Me funcionó cuando obtuve el código de estado 419 y pude manejar el error.
disha

61

Debes crear un mapa de acciones usando la statusCodeconfiguración:

$.ajax({
  statusCode: {
    400: function() {
      alert('400 status code! user error');
    },
    500: function() {
      alert('500 status code! server error');
    }
  }
});

Referencia (desplácese hasta: 'statusCode')

EDITAR (en respuesta a los comentarios)

Si necesita tomar medidas en función de los datos devueltos en el cuerpo de la respuesta (lo que me parece extraño), deberá usar en error:lugar destatusCode:

error:function (xhr, ajaxOptions, thrownError){
    switch (xhr.status) {
        case 404:
             // Take action, referencing xhr.responseText as needed.
    }
} 

Comencé por esa ruta, pero no pude averiguar cómo obtener los datos. ¿Cómo accedes al cuerpo de respuesta?
Andrew

@Andrew: ¿Por qué necesitas acceder al cuerpo de respuesta? ¿Espera que se devuelvan datos útiles cuando se produzca un error 400 o 500?
George Cummins

Sí, estoy usando un código de estado de 400 para errores de validación de formularios. (no estoy seguro de si es apropiado o no)
Andrew

En ese caso, ¿puede realizar la acción de validación de formulario adecuada en el cuerpo del 400: function() {. Simplemente elimine la alerta () y agregue el código necesario.
George Cummins

el cuerpo de la respuesta contiene el html de los mensajes de error. ¿Cómo puedo acceder al cuerpo de la solicitud desde el 400: function() {?
Andrew

10

Otra solución es utilizar la función response.status. Esto le dará el estado http que devuelve la llamada ajax.

function checkHttpStatus(url) {     
    $.ajax({
        type: "GET",
        data: {},
        url: url,
        error: function(response) {
            alert(url + " returns a " + response.status);
        }, success() {
            alert(url + " Good link");
        }
    });
}

8

utilizar

   statusCode: {
    404: function() {
      alert('page not found');
    }
  }

-

$.ajax({
    type: 'POST',
    url: '/controller/action',
    data: $form.serialize(),
    success: function(data){
        alert('horray! 200 status code!');
    },
    statusCode: {
    404: function() {
      alert('page not found');
    },

    400: function() {
       alert('bad request');
   }
  }

});

2
¿Cómo detectaría un statusCode inesperado? ¿Hay un controlador general o de lo contrario en esta versión de la sintaxis?
joedotnot
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.