Esta é uma questão bastante ampla e poderia justificar um wiki por si só. Também há bastante no google sobre os dois, mas acho que posso acertar alguns pontos-chave.
- Se você precisa de uma interface ajax somente leitura para seus servidores e precisa oferecer suporte a IE <= 9, Opera <12 ou Firefox <3.5 ou vários outros navegadores mais antigos ou obscuros, CORS está fora, use JSONP. O IE8 e o IE9 têm suporte para CORS, mas têm problemas, consulte o link no primeiro comentário abaixo.
- Por outro lado, se sua API da web for de leitura / gravação (por exemplo, REST completo ou apenas POST / GET) em vez de apenas leitura (por exemplo, GET), JSONP está fora. Use o CORS. JSONP é inerentemente somente leitura.
Se nada disso for uma preocupação, eu simplesmente escolheria o que for mais fácil ou mais familiar para você. Se for um problema, tente o CORS, já que é a solução mais "moderna" e o JSONP é mais um hack, transformando dados em scripts para contornar as restrições entre domínios. O CORS, entretanto, normalmente requer mais configuração do lado do servidor.
Se você estiver usando jQuery, não tenho certeza de onde surgiu a ideia de que o CORS é " muito mais amigável para o cliente e mais fácil de implementar ". Consulte https://gist.github.com/3131951 . O jQuery abstrai os detalhes do JsonP, e o CORS pode ser um pouco complicado de implementar no lado do servidor, dependendo de qual tecnologia você está usando.
Recentemente, desenvolvi um aplicativo da web, usando jquery e backbone.js, que lê de vários serviços da web de domínio cruzado que controlamos, e acabei usando Json-P em vez de CORS porque precisamos oferecer suporte ao IE7 e era um pouco mais simples no do lado do servidor (rodamos Django c / DjangoRestFramework), e virtualmente o mesmo com jquery no lado do cliente.
Você está muito certo. Se você não tiver que oferecer suporte a navegadores legados (os lançados há mais de 6 anos), eu definitivamente escolheria o CORS.
O CORS é mais fácil de implementar, pois se sua API ainda não oferece suporte a JSONP ou CORS, é mais fácil apenas adicionar alguns cabeçalhos estáticos do que modificar o corpo das respostas.
Também é mais fácil armazenar solicitações em cache usando CORS. Cada solicitação JSONP precisa ser dinâmica, mesmo com conteúdo memcached.
JSONP ainda é uma tag de script, portanto, não importa o que cause algum nível de comportamento síncrono. CORS não.
JSONP só pode ser um GET. E, como no CORS, você pode usar qualquer método.
fonte
Por último, mas não menos importante, se você estiver usando jQuery v1.x , considere que os manipuladores
error
andcomplete
(ou melhorfail
ealways
) ainda não são chamados para solicitações JSONP em algumas situações comuns (por exemplo, erros de rede). Claro que existem soluções alternativas (configuração de tempo limite, plugin jQuery-JSONP), mas acho CORS menos irritante, especialmente quando as solicitações entre domínios vêm apenas de dispositivos móveis (ou seja, aplicativos híbridos), então você não precisa de suporte para navegadores azarados.fonte
De acordo com a documentação do Spring, JSONP é um hack e não uma solução adequada de compartilhamento de recursos de origem cruzada. Portanto, se a segurança não é sua preocupação, basta verificar a origem do domínio no servidor e adicionar o cabeçalho Access-Control-Allow-Origin Response.
fonte
Nossa API Web não estava funcionando no Safari (iOS 9.1) com autenticação do Windows. Estava funcionando com Safari + iOS 8.4. Quando mudamos para JSONP, o Safari voltou a funcionar. Verifique este link para mais informações.
fonte