2012-03-22 23 views
8

El objeto jqXHR de jQuery pasado a la devolución de llamada en caso de error no analiza las respuestas json, por lo tanto, responseJSON no está definido, solo está disponible responseText.jquery ajax no analiza json en caso de error

Funciona bien para solicitudes exitosas, yo pongo las cabeceras correctas utilizando dataType: 'json'

de llamada:

$.ajax({ 
    type: 'POST', 
    url: $form.attr('action'), 
    data: post_data, 
    dataType: 'json', 
    done: done_callback, 
    fail: fail_callback, 
    always: always_callback 
    }); 

cabeceras de solicitud:

Accept:application/json, text/javascript, */*; q=0.01 
X-Requested-With:XMLHttpRequest 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.83 Safari/535.11 

encabezados de respuesta:

Content-Type:application/json;charset=utf-8 
Status:500 

responseText:

{"status":"error","code":500,"message":"A system error occurred, please try again later"} 

responseJSON no está definido

se da el caso de que jQuery no analiza JSON cuando la respuesta a las peticiones Ajax no tiene éxito? no puedo encontrar ninguna documentación para confirmar o negar este comportamiento (que podría estar buscando simplemente no lo suficientemente duro)

puedo, evidentemente, sólo tiene que utilizar parseJSON en el fail de devolución de llamada.

+2

Tienes razón. El contenido de la respuesta no está 'evaluado 'en el error. Si recibe JSON en 500 errores, simplemente analícelo usted mismo. – Strelok

+1

sí. @Arun con toda razón me indicó la línea exacta en la que jquery tomó esta decisión de no pasar la respuesta a través de los convertidores de tipo. – Rob

Respuesta

12

que tenía un aspecto en el método de devolución de llamada Ajax jQuery. Hace la conversión del tipo de datos solo si (status >= 200 && status < 300 || status === 304) es verdadero; de lo contrario, la respuesta se pasa como tal al manejador correspondiente. Es decir, si la solicitud es un error, la respuesta no se analiza según el tipo de datos esperado.

Si desea obtener más información, puede buscar la condición anterior en el archivo jquery.js y ver cómo funciona.

+1

De hecho, es perfecto.¿Tiene alguna idea de por qué jquery tiene esto específicamente codificado, parece muy extraño, los datos de respuesta son válidos incluso para los errores. HTTP1.1 dice "Excepto cuando responda a una solicitud HEAD, el servidor debe incluir una entidad que contenga una explicación de la situación de error" – Rob

+0

Creo que es porque asumen que si la solicitud es un error, entonces el contenido de la respuesta puede no ser confiable –

+1

Esto ya no es cierto: http://bugs.jquery.com/ticket/13917#comment:2 "* A partir de este compromiso: [...] JSON analizado está disponible en caso de fallas como el campo responseJSON de la instancia jqXHR . * " – Ashe

0

Creo que lo que busca es data.status y data.statusText

+1

un objeto de "datos" no se pasa a las devoluciones de llamadas fallidas, solo éxito, quiero mi json como objeto – Rob

+0

Eso sería nuevo para mí, la aplicación que construyo en el momento una aplicación web con alrededor de 100 llamadas ajax y uso en cada uno 'error: función (datos) { alerta ("data:" + data.status + "" + data.statusText); } 'No tengo problemas con eso –

+1

data.statusText es exactamente ese texto definido por HTTP1.1 en mi caso "Error interno del servidor" esto no es lo que quiero, quiero el objeto de respuesta real después del tipo de encadenamiento, no el Objeto XHR, al igual que obtienes una devolución de llamada exitosa. p.ej. '{error:" error ", estado: 500, mensaje:" No podemos recibir su mensaje ahora mismo. "}' – Rob

1

Desde la versión 1.5 de jQuery existe manejador statusCode añadido:

$.ajax({ 
    statusCode: { 
    404: function() { 
     alert("page not found"); 
    } 
    } 
}); 

Sin embargo, en las versiones anteriores se debe analizar el texto de respuesta por separado cuando se devolvió el código de error:

$.ajax({ 
    success: function(response) { 
    data = $.evalJSON(response); 
    alert(data); 
    }, 
    error: function(response) { 
    data = $.evalJSON(response.responseText); 
    alert(data); 
    } 
}); 
+0

Creo que la función nativa es parseJSON no evalJSON, obtengo:" evalJSON no es una función "usando jQuery 1.11.0 –