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%3D123
从http://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的主要内容,如果未能解决你的问题,请参考以下文章