Загрузка междоменного XML с помощью Javascript с использованием гибридной концепции iframe-proxy/xsl/jsonp?
-
18-09-2019 - |
Вопрос
На нашем сайте www.foo.com
мы хотим скачать и использовать http://feeds.foo.com/feed.xml
с Javascript.Мы, очевидно, будем использовать Контроль доступа но для браузеров, которые его не поддерживают, мы рассматриваем в качестве запасного варианта следующее:
На www.foo.com
, мы устанавливаем document.domain
, предоставьте функцию обратного вызова и загрузите канал в (скрытый) iframe
:
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);
На feeds.foo.com
, добавьте XSL в feed.xml
и используйте его для преобразования канала в HTML-документ, который также устанавливает document.domain
и вызывает функцию обратного вызова в родительском элементе с данными фида в формате 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>
Есть ли лучший способ загрузить XML с сайта Feeds.foo.com и каковы последствия этого трюка с iframe-proxy/xslt/jsonp?(..и в каких случаях это выйдет из строя?)
Примечания
- Это не работает в Safari и Chrome, но поскольку оба поддерживают Контроль доступа все в порядке.
- Мы хотим незначительных изменений или вообще не хотим их
feeds.foo.com
- Мы знаем (но не заинтересованы в) прокси-решениях на стороне сервера.
- обновлять: написал об этом
Решение
Если у вас есть контроль над обоими доменами, вы можете попробовать библиотеку междоменных сценариев, например EasyXDM, который реализует особенности кроссбраузерности и предоставляет простой в использовании API для взаимодействия в клиентском скрипте между различными доменами с использованием наилучшего доступного механизма для этого браузера (например, сообщениеСообщение если имеются, то другие механизмы, если нет).
Предостережение:вам необходимо иметь контроль над обоими доменами, чтобы он работал (где «контроль» означает, что вы можете размещать статические файлы на обоих из них).Но вам не нужны какие-либо изменения кода на стороне сервера.
Еще одно предостережение:здесь есть последствия для безопасности - убедитесь, что вы доверяете сценарию другого домена!
Другие советы
Вы можете использовать Yahoo API (YQL)..Просто укажите URL, формат и обратный вызов
- Междоменные запросы с помощью jQuery Джеймс Падолси
- плагин jQuery
Это своего рода серверное решение, но не на вашем сервере :)