2011-03-17 26 views
6

Estoy implementando una aplicación que se basa en la comunicación entre un cliente de JavaScript y un servidor que sabe cómo responder al cliente utilizando la notación JSONP.Analizando JSONP Respuesta en Javascript cuando 4xx o 5xx Http Código de error está presente

Estoy tratando de manejar el caso en mi cliente de Javascript, donde mi servidor regresa con un código de estado http de 4xx o 5xx. Actualmente, lo que veo es que el script no se evalúa porque el navegador cree que es un error (lo cual es). Sin embargo, aún quiero leer lo que mi servidor tiene que decir en el caso de esta respuesta 4xx o 5xx código en mi cliente JavaScript

Estoy viendo que esto genera un error en el elemento de etiqueta de script, pero me preocupa que esto no sea un navegador cruzado y no será una solución robusta.

¿Alguien ha tenido suerte al analizar aún una respuesta jsonp aunque el código de estado http es 4xx o 5xx?

Empiezo a creer que debería utilizar esta solución de "establecer un tiempo de espera" que "detecta" una falla indicando que la función de devolución de llamada a la solicitud jsonp se completará dentro de un marco de tiempo determinado, y si no lo hace , Hubo un error.

EDITAR: Siempre estoy regresando 200 código de estado cuando mi servidor detecta un cliente jsonp y luego tuneliza el mensaje de error/estado en el objeto json devuelto. Tenía la esperanza de aprovechar los códigos de estado HTTP, pero estoy pensando que no es para un cliente de JavaScript.

Respuesta

7

Un enfoque al usar JSONP es incrustar información de estado en la devolución de llamada. Por lo que la firma de la función de devolución de llamada se vería

callback(result, status, message) 

Así que si su llamada se parece

http://myurl.com/?callback=fn 

generar código para una llamada exitosa que se parece a

fn({"data":"my great data"}, 200) 

y de una condición excepcional

fn(null, 500, "server error"} 
+0

¿Alguna idea de cómo se puede lograr esto utilizando el proyecto Lumen/Laravel? – jtanmay

-3

Puede consultar el status del objeto XHR (si no está utilizando una biblioteca JS).

if(xhr.readyState == 4){ 
    if(xhr.status == 200){ 
    // good 
    }else if(xhr.status == 502){ 
    // d'oh 
    } 
} 

Si está utilizando jQuery, puede pasar en un statusCode para manejar casos especiales para $.ajax

+1

Estoy usin g JSONP para eludir las restricciones de dominio cruzado. http://en.wikipedia.org/wiki/JSON#JSONP Sección 8.1 –

+1

@Macy Parece que necesito dormir un poco: p De todos modos, hay una discusión similar [aquí] (http://stackoverflow.com/questions/1002367/jquery-ajax-jsonp-ignores-a-timeout-and-doesnt- fire-the-error-event). – Haochi

+0

genial, gracias por ese enlace –

8

JSONP es un truco para trabajar en torno a temas de varios dominios. Cuando trabaja, trabaja bien. Pero cuando no lo hace, no tiene una forma de descubrir qué salió mal.

setTimeout es otro hack encima del original. Si debe usar JSONP y aún necesita detección de errores (no de manejo), eso es lo que tendría que hacer. No hay una mejor solución.

Si controla el servidor, intente utilizar alternativas como Cross-Origin-Resource-Sharing (CORS) o Flash's crossdomain.xml para permitir solicitudes de dominios cruzados. Si no controla el servidor, puede realizar un proxy de la respuesta a través de su servidor para obtener un mejor control.

+0

¿La falta de compatibilidad con navegadores cruzados para CORS es un problema importante en su opinión? http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing –

+1

Es un problema importante, pero también lo son todas las demás soluciones. CORS funciona en la mayoría de los navegadores nuevos (incluido el safari móvil), pero no funciona en los navegadores más antiguos. Flash es universal en el escritorio, pero no funciona en dispositivos móviles. El proxy del lado del servidor funciona en todas partes, pero necesita trabajo adicional. JSONP no tiene manejo de errores. Elige el menor de los males. –

Cuestiones relacionadas