2008-11-27 103 views
6

根据我的理解,由于当前浏览器中的“同源策略”强制执行,无法从发送到不同于Javascript原始域的XmlHttpRequest数据中获取数据。如何从客户端脚本中使用远程Web服务?

我对这件事情有接近零的经验,所以我对Web服务在Javascript中无法使用感到困惑。 这是否意味着具有Ajax功能的Web应用程序只能与自己进行交互而无需调用其他域提供的服务? “mash-ups”如何工作?我猜这些服务是服务器端使用的,然后通过本地的Ajax调用将数据传递给客户端。我不知道。

我可以想象的实现客户端服务消费的唯一方法是通过<script>标记直接从目标Web服务的域中检索JavaScript文件,然后使用其API与远程域进行交互。

任何人都可以启发我吗?

+0

其实你对它有很好的把握。只记得Ajax是普通的旧http。 – 2008-11-27 22:55:45

+0

是的,你打在头上......包括周围的工作! – 2008-11-28 03:42:59

回答

6

在你的问题你提到的<脚本>诡计。 JSONP就是基于此。 It was formally proposed almost 3 years ago by Bob Ippolito。它不会让您有权与脚本的来源进行交谈—原点是由您的网页定义的,而不是由它包含的内容决定的。它的工作原理只是因为服务器将JSON封装在一个应该在代码中定义的回调函数中,并且在加载时将由<脚本>执行。 JSONP最着名的例子是Yahoo服务,包括Flickr。

另一种技术是使用window.name传输信息。 This technique was detailed by Kris Zyp four month ago。另外他的文章比较了window.name传输和JSONP。我不知道任何支持这种新型运输的高端服务提供商。显然它会随着时间而改变。

当然,我应该提到即将推出的Microsoft XDomainRequest。它正在计划与IE8一起发货,并且没有其他供应商承诺支持它,但它已被列入HTML 5中.XDR是一个有用的功能块,但我怀疑它会在更改之前进行多次更改公认。

如果您查看了您现在可能知道的链接,那么所有这些方法都需要来自第三方服务器的特定级别的合作。你不能随意使用随机服务。如果您必须使用不合作的服务,唯一的解决方案是通过您自己的服务器代理它,并解决所有相关问题:合法性问题,性能降低,服务器负载增加,用户浏览器与用户浏览器之间的连接数减少你的服务器等等。

3

看一看JSONP,它使用几乎你所描述的方法周围的同源策略的工作,只要确保你信任,你得到它...