Então, JSONP ou CORS? [fechadas]

111

Meu WebAPI foi implantado no ambiente de intranet . Isso significa que a segurança não era minha preocupação.

Parece que o CORS é muito mais amigável para o cliente e mais fácil de implementar .

Alguma outra preocupação que eu possa ter esquecido?

rapsódia
fonte

Respostas:

144

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.

Ben Roberts
fonte
3
Se você oferece suporte ao IE8 e ao IE9, ele também pode descartar o CORS porque o Content-Type foi forçado a "text / plain", consulte o ponto (4) em blogs.msdn.com/b/ieinternals/archive/2010/05 / 13 /…
jamiebarrow
A essência da sua resposta é muito útil, obrigado!
MVCDS
O que eu entendi é que JSONP você tem que lidar no lado do cliente e CORS você tem que lidar no lado do servidor. corrigir?
Afunda em
Eu só quero acrescentar que mesmo jsonp pode ser chamado por meio de GET, você pode codificar seu back-end para realizar gravações. Você pode passar o parâmetro na querystring, para simular post, put, patch com um GET e quesystring params. (não é o ideal, claro)
Gabriel Carignano
45

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.

user2175183
fonte
3
Apreciei as informações sobre "comportamento síncrono".
Juan Lanus
Eu acredito que você pode fazer o download de um script de forma assíncrona. JQuery fornece este parâmetro em suas solicitações ajax. Não tenho certeza se funciona para jsonp ou não. api.jquery.com/jquery.ajax
eran otzap
11

Por último, mas não menos importante, se você estiver usando jQuery v1.x , considere que os manipuladores errorand complete(ou melhor faile always) 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.

matpop
fonte
1
+1 para informações sobre chamadas de retorno
plainjimbo
1

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.

MDaniyal
fonte
-1

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.

Anoop
fonte
Este é um bom artigo também - blog.algolia.com/jsonp-still-mandatory
Anoop