Erro 'No Transport' w / jQuery ajax call no IE

110

Eu preciso usar a API do foursquare para pesquisar locais. Claro que é entre domínios.

Não tem nenhum problema no Firefox, mas sim no Internet Explorer (7, 8, 9 que testei).

Meu código javascript se parece com:

searchVenues: function(searchQuery) {
    $.ajax({
       url: 'https://api.foursquare.com/v2/venues/search',
       data: {
            sw: bound_south_west,
            ne: bound_north_east,
            query: searchQuery.query,
            oauth_token: FSQ_OAUTH_TOKEN,
            limit: 25,
            intent: 'browse',
            v: 20120206
       },
       cache: false,
       dataType: 'json',
       success: function(data) {
           displayResults(data, searchQuery.query);
       },
       error: function(xhr, status, errorThrown) {
           console.log(errorThrown+'\n'+status+'\n'+xhr.statusText);
       }
    });
}

No Firefox, ele exibe perfeitamente os dados recebidos. No Internet Explorer, ele faz logon no console:

No Transport
Error
Error

O que devo fazer?

Cantou
fonte
6
Verifique as respostas para este SO pós
mkozicki

Respostas:

265

Testei isso no Windows Mobile 7.

Depois de muito tempo gasto para entender, eu finalmente encontrei isto:

http://bugs.jquery.com/ticket/10660

A solução é simples, basta definir isto:

$.support.cors = true;

e as solicitações de domínio cruzado Ajax funcionarão!

Mágico
fonte
47
Estou recebendo 'Erro: acesso negado' também no IE8 e no IE9
Darren Cooney
1
É um pouco desanimador que a resposta aceita não resolva realmente o problema no IE8 ou IE9.
Warren Rumak
2
Eu tenho um problema semelhante. Funciona no IE10, mas não no IE8 ou IE9
mishka
7
Também recebi "Erro: acesso negado", meu erro foi extrair conteúdo HTTPS de um domínio HTTP. Certifique-se de que seu site e seu destino ajax usem os mesmos protocolos (HTTP OU HTTPS)
Torben
2
Acredito que isso seja definido por padrão agora. Para mim, a solução foi um transporte de solicitação XDR - veja esta resposta popular: stackoverflow.com/a/10232313/217866
jackocnr
13
jQuery.support.cors = true;

$.ajax({
  crossDomain: true,
  url: "",
  type: "POST",
  dataType: "xml",
  data: soapMessage,
});

você precisa tornar o valor de domínio cruzado verdadeiro

amit thakur
fonte
8
Qual a diferença entre a sua resposta e a aceita, que foi postada algum tempo antes da sua?
javanna,
2
@javanna A adição de crossDomain: trueao argumento de opções.
Chris Marasti-Georg
8
O que é o domínio cruzado e por que ele precisa ser verdadeiro?
Aziz Saleh
Você não precisa crossDomain: truedisso $.support.corspor padrão, se não me engano
Mark Pieszak - Trilon.io
7

Este problema está me incomodando há algum tempo. Como solução alternativa, uso scripts de proxy localizados no mesmo site. Esses scripts simplesmente executam uma solicitação HTTP não ajax de servidor para servidor (pense em curl e WinHttp.WinHttpRequest) e passam o status e os dados de volta para o chamador. Funciona, mas obviamente não é muito eficiente porque precisa realizar duas solicitações HTTP.

No meu caso, a solução é uma combinação de todas as coisas descritas acima mais o cabeçalho 'Access-Control-Allow-Origin'.

$.support.cors = true; // this must precede $.ajax({}) configuration

$.ajax({
  crossDomain: true, // added in jQuery 1.5
  headers: {
    'Access-Control-Allow-Origin': '*'
  },
  ...
});

O serviço da web que atende essas chamadas também responde com o cabeçalho 'Access-Control-Allow-Origin: *'.

Alex D
fonte
4
... e ainda esta é a primeira resposta a mencionar o cabeçalho CORS. A solução aceita não funcionou para mim.
seanhodges
2
Acho que isso deveria estar no web.config do serviço.
Fjodr
6

Experimente esta solução:

https://stackoverflow.com/a/14463975/237091

Ou simplesmente coloque este código em seu HTML logo após incluir jquery.

<!--[if lte IE 9]>
<script type='text/javascript' src='//cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.3/jquery.xdomainrequest.min.js'></script>
<![endif]-->
Scott Stafford
fonte
Eu encontrei o mesmo problema ocorrendo no Chrome (e possivelmente no navegador Android) no Android, então talvez deixe o comentário condicional para permitir que todos os navegadores usem este script. (A página inicial do projeto está aqui: github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest )
Dave Burt
1
Isso funcionou para mim. Além de certificar-se de que o tipo de conteúdo de resposta seja 'texto / simples'
Nikolay Melnikov,
Eu adicionei no Grunt depois do jquery e agora ele funciona ( npmjs.com/package/jquery-ajax-transport-xdomainrequest ).
tobias47n9e
0

Acabei de alterar a versão do jquery e substituí o link CDN e funcionou! Faça isso se crossDomain:truee $.support.cors= true não funcionar.

<script src="https://code.jquery.com/jquery-3.5.1.js" integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=" crossorigin="anonymous"></script>
Sagar Kumar
fonte