JavaScript、JSONP 和跨域读取 XML

Posted

技术标签:

【中文标题】JavaScript、JSONP 和跨域读取 XML【英文标题】:JavaScript, JSONP and reading XML from cross-domain 【发布时间】:2011-07-31 12:52:27 【问题描述】:

在我的 JS 项目中,我需要从跨域加载数据。 (javascript 位于域 A,数据来自域 B)

我有一个使用JSONP 的解决方案,但我确实需要加载一个 XML(普通 XML 音乐播放列表)。主要目标是能够加载和解析 XML 数据,而无需先将它们修改为其他格式(如 JSONP)。

这完全不可能吗?或者有什么解决方法或技巧?

我主要针对 ios 上的最新浏览器。

谢谢!

PS:easyXDM 有什么帮助吗?还是与 XML 无关?

更新:不幸的是我不能使用代理,我真的在问一个直接的解决方案。

【问题讨论】:

easyXDM 绝对可以提供帮助 - 你看过 XHR 演示吗? 【参考方案1】:

您完全可以这样做,只需让您的域 B 返回类似的内容

func("<myxml></myxml>");

var someVar = "<myxml></myxml>";

JSONP 这个名称实际上与 JSON 没有任何关系,因为它的概念完全是关于执行将数据嵌入代码中的 JavaScript。

一旦您的域 B 恰好返回上述两种形式之一,域 A 可以通过以下方式简单地使用它:

<script>
function func(xmlString) 
    alert(xmlString); // you can parse the xmlString with 
                      // jQuery or something else

</script>

或者如果你使用第二个例子:

<script>
alert(someVar);
</script>

【讨论】:

【参考方案2】:

通常的解决方案是拥有一个“AJAX 代理”——一个在您的域上运行的简单服务器端脚本,它从其他域获取数据并原封不动地返回。

最简单的方法是为脚本提供您需要数据的 URL:

http://example.com/proxy.php?url=http%3A%2F%2Fexample.org%2Fajax%3Fid%3D123http://example.org/ajax?id=123获取数据

但是,如果您让任何 URL 被这样获取,这可能会被滥用,因此您应该有您的脚本,检查它实际上只从特定 URL 获取数据。

为了避免必须解析 URL 来检查这一点,您可以专门为您的应用编写一个代理,它只访问您需要的特定资源:

http://example.com/proxy.php?id=123 访问http://example.org/ajax?id=123

【讨论】:

感谢您的建议,不幸的是我无法使用代理,我真的想知道是否有任何直接的解决方案。我会更新问题。【参考方案3】:

如果您有 JSON-P 解决方案,您可以将 XML 作为字符串传递给 JSON-P 回调。然后你可以做XML parsing of a variable string in JavaScript

【讨论】:

服务器端需要什么? XML 可以“即时”打包为 JSONP 回调吗? 假设您的服务器在名为“xml”的变量中有 xml 响应,并且 JSON-P 回调的名称是“callback”。然后,您的服务器将不得不执行类似的操作(这是伪代码):print callback + "('" + escapeForJs(serializeXmlToString(xml)) + "');"; Luca Matteis 的回答也涵盖了这一点。【参考方案4】:

JSONP 的整体理念是响应必须是可作为脚本执行的。当然,您可以将 XML 数据传回,只要它是有效的 Javascript - 例如,服务器可以将其响应包装在一个字符串中:

myCallback('<xml><stuff/></xml>')

你必须用 jQuery 解析它:

success: function(data)  
    var xml = $(data); // now do stuff 

这假设您控制其他服务器和/或有兴趣以这种方式格式化他们的数据的人。否则,你运气不好,需要某种代理 - 你也许可以do this with YQL。

【讨论】:

正是我的想法,非常感谢您的澄清。我明天会选择它。因为我要等 9 分钟....:) 我猜服务器管理员更喜欢发送 json 对象而不是 xml ......只是因为大小?? 有很多理由将服务器响应格式化为 JSON - 大小是一个,但它也更容易用多种语言生成,而且,正如这个问题所示,JSON 也是有效的 Javascript 代码,所以它可以在 JSONP 请求中轻松使用。 当你说:“所以它可以在 JSONP 请求中轻松使用......”你的意思是在我得到响应之后 - 我不必像分析 XML 一样分析对象。我可以把它当作普通的 JS 对象来用……你是这个意思吗? 我的意思是它不需要任何后期处理。如果您像我的回答那样以字符串形式发送 XML,则需要对其进行解析才能在 Javascript 中使用。如果服务器以 JSON 响应,例如callback( "success": 1 ),它已经是有效的 Javascript - 无需解析。

以上是关于JavaScript、JSONP 和跨域读取 XML的主要内容,如果未能解决你的问题,请参考以下文章

javascript笔记——jsonp

同源和跨域

同源跨域 + JSONP + 防抖节流

跨域总结-JSONP和XHR2

web服务(同域和跨域)

跨域JSONP原理及调用详细演示样例