我想出了一个需要从JavaScript调用stackapps的应用程序的想法,但是当我开始对它进行原型化时,我很快发现这个API不允许跨源请求。这意味着试图在另一个域上通过JavaScript检索JSON对象将失败,因为浏览器会因为同源政策而阻止它。这通常也是Flash和Silverlight请求的一个问题,但我确实看到,API已经实现了闪存crossdomain.xml (示例)和银灯clientaccesspolicy.xml (示例)文件,以允许使用插件进行跨源请求。
虽然我可以使用Flash或Silverlight来代替JavaScript,但它是一个非常简单的应用程序,只需要访问几个方法调用。另外,我已经看到了对JavaScript包装器的请求,但是如果不允许跨源请求,包装器就不会有多大用处。有一个很少有不同的方法绕过相同的起源策略,但其中大多数涉及大量工作或不兼容基于IP的速率限制所使用的API。我认为可以使用两种主要方法来允许使用javascript访问API:
Access-Control-Allow-Origin: * http报头添加到所有API方法中。这允许在大多数浏览器中使用XMLHttpRequest对象或在IE8中使用XDomainRequest对象的跨域请求。type=jsonp参数,通过下载JSON对象作为动态脚本标记,而不是原始JSON文本,然后将其传递给用户定义的回调函数,从而使用按需Javascript或软垫JSON方法绕过相同的原始策略。这两种方法各有优缺点,但我认为最简单的方法是添加访问控制头。为了展示这个问题和潜在解决方案的例子,我设置了一个测试页,它应该与IE8、Firefox、Chrome和Safari一起工作。测试页面允许您尝试使用XMLHttpRequest或XDomainRequest对象下载各种文件,并查看相同的源策略和访问控制头对每个文件的影响。您还可以使用web-sniffer.net站点来检查每个请求的URL的headers。
发布于 2010-05-27 19:39:29
https://stackapps.com/questions/320
复制相似问题