Carregando XML domínio cruzado com JavaScript usando a / xsl / jsonp conceito híbrido iframe-proxy?
-
18-09-2019 - |
Pergunta
Em nosso site www.foo.com
queremos para download e uso http://feeds.foo.com/feed.xml
com Javascript. Nós vamos obviamente usar Access-Control mas para navegadores que não suportam-lo estamos considerando o seguinte como um retorno:
Em www.foo.com
, nós set document.domain
, fornecer uma função de retorno de chamada e carregar a alimentação em um iframe
(oculto):
document.domain = 'foo.com';
function receive_data(data) {
// process data
};
var proxy = document.createElement('iframe');
proxy.src = 'http://feeds.foo.com/feed.xml';
document.body.appendChild(proxy);
Em feeds.foo.com
, adicione um XSL para feed.xml
e usá-lo para transformar a alimentação em um documento HTML que também define document.domain
e chama a função de retorno de chamada em seu pai com os dados da alimentação como JSON:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="ROOT">
<html><body>
<script type="text/javascript">
document.domain = 'foo.com';
parent.receive_data([<xsl:apply-templates/>]);
</script>
</body></html>
</xsl:template>
<!-- templates that transform data into json objects go here -->
</xsl:stylesheet>
Existe uma maneira melhor de XML carga de feeds.foo.com e quais são as ramificações desta iframe-proxy / XSLT / jsonp truque? (..E em que casos ele irá falhar?)
Observações
- Este não funciona no Safari e Chrome, mas uma vez que ambos apoio Access-Control Está tudo bem.
- Queremos pouca ou nenhuma mudança para
feeds.foo.com
- Estamos cientes de (mas não está interessado em) soluções de proxy do lado do servidor
- actualização: escreveu sobre ele
Solução
Se você tem controle sobre ambos os domínios, você pode tentar uma biblioteca de script cross-domain como EasyXDM , que envolve peculiaridades cross-browser e fornece uma API-to fácil de usar para se comunicar em script de cliente entre diferentes domínios usando o melhor mecanismo disponível para esse navegador (por exemplo, postMessage se possível, outros mecanismos se não).
Aviso: você precisa ter controle sobre ambos os domínios, a fim de torná-lo trabalho (onde os meios "controlar" você pode colocar arquivos estáticos em ambos). Mas você não precisa de quaisquer alterações no código do lado do servidor.
Outra ressalva: existem implicações de segurança aqui-- certificar-se de que você confia roteiro do outro domínio
!Outras dicas
Você pode usar APIs do Yahoo ( YQL ) .. Basta especificar url, formato e callback
- pedidos de domínio cruzado com jQuery por James Padolsey
- plugin jQuery
É uma espécie de solução do lado do servidor, no entanto, não no seu servidor:)