Entonces, ¿JSONP o CORS? [cerrado]

111

Mi WebAPI se implementó en el entorno de Intranet . Eso significa que la seguridad no era mi preocupación.

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

¿Alguna otra inquietud que pueda haber pasado por alto?

rapsodia
fuente

Respuestas:

144

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

  • Si necesita una interfaz ajax de solo lectura para sus servidores y necesita ser compatible con IE <= 9, Opera <12 o Firefox <3.5 o varios otros navegadores antiguos u oscuros, CORS no está disponible, use JSONP. IE8 e IE9 son compatibles con CORS pero tienen problemas, consulte 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 solo POST / GET) en lugar de solo lectura (es decir, GET), JSONP está desactivado. Utilice CORS. JSONP es inherentemente de solo lectura.

Si ninguno de estos es una preocupación, simplemente elegiría lo que le resulte más fácil o familiar. Si es un problema, pruebe CORS, ya que es la solución más "moderna" y JSONP es más un truco, convirtiendo los datos en scripts para evitar las restricciones entre dominios. Sin embargo, CORS normalmente requiere más configuración del lado del servidor.

Si está utilizando jQuery, no estoy seguro de dónde se le ocurrió la idea de que CORS es " mucho más amigable para el cliente y más fácil de implementar ". Consulte https://gist.github.com/3131951 . jQuery abstrae los detalles de JsonP, y CORS puede ser algo complicado de implementar en el lado del servidor dependiendo de la tecnología que esté utilizando.

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

Ben Roberts
fuente
3
Si es compatible con IE8 e IE9, también puede descartar CORS debido a que el tipo de contenido está obligado a "texto / sin formato", consulte el punto (4) en blogs.msdn.com/b/ieinternals/archive/2010/05 / 13 /…
jamiebarrow
La esencia de su respuesta es muy útil, ¡gracias!
MVCDS
Lo que entendí es JSONP que debe manejar en el lado del cliente y CORS que debe manejar en el lado del servidor. ¿correcto?
Dips
Solo quiero agregar que incluso jsonp se puede llamar a través de GET, puede codificar su backend para realizar escrituras. Puede pasar el parámetro en la cadena de consulta, por lo que podría simular publicar, poner, parchear con un GET y los parámetros de cadena de consulta. (no es el ideal, por supuesto)
Gabriel Carignano
45

Estás muy 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 es compatible con JSONP o CORS, es más fácil agregar algunos encabezados estáticos que modificar el cuerpo de las respuestas.

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

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

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

usuario2175183
fuente
3
Aprecié la información de "comportamiento sincrónico".
Juan Lanus
Creo que puede hacer una descarga de script de forma asincrónica. JQuery proporciona este parámetro en sus solicitudes ajax. No estoy seguro de si funciona para jsonp o no. api.jquery.com/jquery.ajax
eran otzap
11

Por último, pero no menos importante, si usted está usando jQuery v1.x , tenga en cuenta que errory complete(o mejor faily always) manipuladores todavía no están llamados a JSONP solicitudes en algunas situaciones comunes (por ejemplo, errores de red). Claro que hay soluciones alternativas (configuración de tiempo de espera, complemento jQuery-JSONP), pero CORS me resulta menos molesto, especialmente cuando las solicitudes entre dominios solo provienen de dispositivos móviles (es decir, aplicaciones híbridas), por lo que no necesita soporte para navegadores desafortunados.

matpop
fuente
1
+1 para obtener información sobre devoluciones de llamada
plainjimbo
1

Según Spring Documentation, JSONP es un truco y no una solución adecuada para compartir recursos de origen cruzado. Entonces, si la seguridad no es su preocupación, simplemente verifique el origen de su dominio en su servidor y agregue el encabezado Access-Control-Allow-Origin Response.

MDaniyal
fuente
-1

Nuestra API web no funcionaba en Safari (iOS 9.1) con autenticación de Windows. Funcionaba con Safari + iOS 8.4. Cuando cambiamos a JSONP, Safari comenzó a funcionar nuevamente. Consulte este enlace para obtener más información.

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