Quindi, JSONP o CORS? [chiuso]


111

La mia WebAPI è stata distribuita nell'ambiente Intranet . Ciò significa che la sicurezza non era la mia preoccupazione.

Sembra che CORS sia molto più amichevole per il cliente e più facile da implementare .

Qualche altra preoccupazione che potrei aver perso?

Risposte:


144

Questa è una domanda piuttosto ampia e potrebbe giustificare un wiki a sé stante. C'è anche un bel po 'su Google per quanto riguarda i due, ma penso di poter colpire alcuni punti chiave.

  • Se hai bisogno di un'interfaccia ajax di sola lettura per i tuoi server e devi supportare IE <= 9, Opera <12, o Firefox <3.5 o vari altri browser meno recenti o oscuri, CORS è disponibile, usa JSONP. IE8 e IE9 supportano in qualche modo CORS ma hanno problemi, vedere il collegamento nel primo commento qui sotto.
  • D'altra parte, se la tua API web è di lettura / scrittura (ad es. REST completo o solo POST / GET) invece che di sola lettura (ad es. GET), JSONP è fuori. Usa CORS. JSONP è intrinsecamente di sola lettura.

Se nessuna di queste è una preoccupazione, andrei semplicemente con ciò che ti è più semplice o familiare. Se è un problema, prova CORS, poiché è la soluzione più "moderna" e JSONP è più un hack, trasformando i dati in script per aggirare le restrizioni tra domini. CORS, tuttavia, in genere richiede più configurazione lato server.

Se stai usando jQuery, non sono sicuro di dove ti venga in mente l'idea che CORS sia " molto più amichevole per il cliente e più facile da implementare ". Vedi https://gist.github.com/3131951 . jQuery riassume i dettagli di JsonP e CORS può effettivamente essere un po 'complicato da implementare sul tuo server a seconda della tecnologia che stai utilizzando.

Recentemente ho sviluppato un'app web, utilizzando jquery e backbone.js, che legge da vari servizi web interdominio che controlliamo, e ho finito per utilizzare Json-P invece di CORS perché abbiamo bisogno di supportare IE7 ed è stato un po 'più semplice su lato server (eseguiamo Django con DjangoRestFramework) e praticamente lo stesso con jquery sul lato client.


3
Se stai supportando IE8 e IE9, puoi anche escludere CORS perché Content-Type è forzato a "text / plain", vedi il punto (4) su blogs.msdn.com/b/ieinternals/archive/2010/05 / 13 /…
jamiebarrow

Il succo della tua risposta è molto utile, grazie!
MVCDS

Quello che ho capito è che JSONP devi gestire dal lato client e CORS che devi gestire dal lato server. corretta?
Dips

Voglio solo aggiungere che anche jsonp può essere chiamato tramite GET, puoi codificare il tuo backend per eseguire scritture. Puoi passare il parametro sulla stringa di query, in modo da poter simulare i parametri di post, put, patch con GET e quesystring. (non l'ideale ovviamente)
Gabriel Carignano

45

Sei abbastanza a posto. Se non è necessario supportare i browser legacy (quelli rilasciati più di 6 anni fa), sceglierei sicuramente CORS.

CORS è più facile da implementare, in quanto se la tua API non supporta già JSONP o CORS è più facile aggiungere solo alcune intestazioni statiche che modificare il corpo delle risposte.

Inoltre è più facile memorizzare nella cache le richieste utilizzando CORS. Ogni richiesta JSONP deve essere dinamica anche con contenuto memcached.

JSONP è ancora un tag script, quindi non importa cosa causerà un certo livello di comportamento sincrono. CORS non lo farà.

JSONP può essere solo un GET. E come con CORS puoi usare qualsiasi metodo.


3
Ho apprezzato le informazioni sul "comportamento sincrono".
Juan Lanus

Credo che tu possa scaricare uno script in modo asincrono. JQuery fornisce questo parametro sulle sue richieste ajax. Non sono sicuro che funzioni per jsonp o meno. api.jquery.com/jquery.ajax
eran otzap

11

Ultimo ma non meno importante, se stai usando jQuery v1.x , considera che errore complete(o meglio faile always) gli handler non vengono ancora chiamati per le richieste JSONP in alcune situazioni comuni (ad esempio errori di rete). Sicuramente ci sono soluzioni alternative (impostazione del timeout, plug-in jQuery-JSONP), ma trovo CORS meno fastidioso, specialmente quando le richieste tra domini provengono solo da dispositivi mobili (cioè app ibride), quindi non è necessario il supporto per browser sfortunati.


1
+1 per le informazioni sulle richiamate
plainjimbo

1

Secondo Spring Documentation, JSONP è un hack e non una soluzione adeguata di Cross Origin Resource Sharing. Quindi, se la sicurezza non è la tua preoccupazione, controlla semplicemente l'origine del tuo dominio sul tuo server e aggiungi l'intestazione Access-Control-Allow-Origin Response.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.