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?

Andrés
fuente

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.

Alex Reynolds
fuente
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.
    }
} 
George Cummins
fuente
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");
        }
    });
}
CodeWhisperer
fuente
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');
   }
  }

});
génesis
fuente
2
¿Cómo detectaría un statusCode inesperado? ¿Hay un controlador general o de lo contrario en esta versión de la sintaxis?
joedotnot