2012-09-06 16 views
101

Mi WebAPI se implementó en el entorno Intranet. Eso significa seguridad no era mi problema.Entonces, ¿JSONP o CORS?

Parece que CORS es mucho más amigable al cliente y más fácil de implementar.

¿Alguna otra preocupación que me podría haber pasado por alto?

Respuesta

130

Esta es una pregunta bastante amplia, y podría justificar una wiki en sí misma. También hay un poco en google con respecto a los dos, pero creo que puedo golpear algunos puntos clave.

  • Si necesita un solo lectura interfaz AJAX para sus servidores y que necesita para apoyar IE < = 9, Opera < 12, o Firefox < 3.5 o varios otros navegadores antiguos o oscuros, CORS está fuera, utilizar JSONP . IE8 e IE9 soportan CORS pero tienen problemas, vea el enlace en el primer comentario a continuación.
  • Por otro lado, si su API web es de lectura/escritura (por ejemplo, REST completo o simplemente POST/GET) en lugar de simplemente leer (es decir, GET), JSONP está desactivado. Usa CORS. JSONP es intrínsecamente de solo lectura.

Si ninguno de estos es un problema, simplemente elegiré lo que sea más fácil o más familiar para usted. Si es un lanzamiento, prueba CORS, ya que es la solución más "moderna" y JSONP es más un hack, convirtiendo datos en scripts para eludir las restricciones entre dominios. Sin embargo, CORS generalmente requiere más configuración del lado del servidor.

Si estás usando jQuery, no estoy seguro de dónde viene la idea de que CORS es "mucho más amigable al cliente y más fácil de implementar." Ver https://gist.github.com/3131951. jQuery abstrae los detalles de JsonP, y CORS en realidad puede ser un tanto complicado de implementar en su servidor dependiendo de la tecnología que esté usando.

Recientemente desarrollé una aplicación web, usando jquery y backbone.js, que lee de varios servicios web de dominio cruzado que controlamos, y terminamos usando Json-P en lugar de CORS porque necesitamos dar soporte a IE7 y era un poco más simple en el lado del servidor (ejecutamos Django w/DjangoRestFramework), y prácticamente lo mismo con jquery en el lado del cliente.

+2

Si admite IE8 e IE9 también puede descartar CORS debido a que el Tipo de contenido se ve obligado a "texto/normal", consulte el punto (4) en http://blogs.msdn.com/b/ ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx – jamiebarrow

+0

Make sense buddy –

+0

Lo fundamental en tu respuesta es muy útil, ¡gracias! – MVCDS

40

Eres bastante acertado. Si no tiene que admitir navegadores heredados (los lanzados hace más de 6 años), definitivamente iría con CORS.

CORS es más fácil de implementar, ya que si su API no admite JSONP o CORS, es más fácil simplemente agregar unos pocos encabezados estáticos que modificar el cuerpo de respuestas.

También es más fácil guardar en caché las solicitudes usando CORS. Cada solicitud JSONP debe ser dinámica incluso con contenido protegido.

JSONP sigue siendo una etiqueta de secuencia de comandos, por lo que no importa lo que cause un cierto nivel de comportamiento sincrónico. CORS no lo hará.

JSONP solo puede ser un OBJETIVO. Y al igual que con CORS puedes usar cualquier método.

+3

Aprecio la información de "comportamiento sincrónico". –

10

Por último, pero no menos importante, si está utilizando jQuery v1.x, tenga en cuenta que los controladores error y complete (o mejores fail y always) aún no reciben solicitudes de JSONP en algunas situaciones comunes (por ejemplo, errores de red). Claro que hay soluciones temporales (configuración de tiempo de espera, complemento JQuery-JSONP), pero considero que CORS es menos molesto, especialmente cuando las solicitudes de dominio cruzado solo provienen de dispositivos móviles (es decir, aplicaciones híbridas) por lo que no necesita soporte para navegadores desafortunados.

+1

+1 para obtener información sobre devoluciones de llamadas – plainjimbo

-1

Nuestra API web no funcionaba en Safari (iOS 9.1) con Autenticación de Windows. Estaba trabajando con Safari + iOS 8.4. Cuando cambiamos a JSONP Safari comenzó a funcionar nuevamente. Consulte this link para obtener más información.

+0

Este también es un buen artículo: https://blog.algolia.com/jsonp-still-mandatory/ – Anoop

1

De acuerdo con Spring Documentation, JSONP es un truco y no una solución adecuada de Cross Origin Resource Sharing. Entonces, si la seguridad no es su problema, simplemente verifique el origen de su dominio en su servidor y agregue el encabezado Respuesta-Control-Permitir-Origen-Respuesta.