我在域api.example.com上有一个REST API服务。并希望在www.example.com上使用此API也用于我的javascript ajax请求。
我使用CORS构建我的jQuery AJAX请求(GET,POST,PUT和DELETE),并且在firefox和chrome上都可以正常工作。我在Opera上测试了脚本,没有加载。在此之后,我阅读了一些在线文章,并且必须意识到CORS不适用于Opera。
获取和放置数据到休息服务有哪些替代方案? JSONp不起作用,因为我也需要其他HTTP动词(POST,PUT,DELETE)。
在同一个域上创建“隧道”php脚本?但是,我有更多的网络流量和服务器负载。
Client -> WWW-Server -> API-Server
API-Server -> WWW-Server -> Client
而不是
Client -> API-Server
API-Server -> Client
我很感谢能与我分享的每一个想法。
答案 0 :(得分:3)
您可以使用第三方工具进行隧道掘进,例如YQL。
雅虎!查询语言是一种富有表现力的类似SQL的语言,允许您跨Web服务查询,过滤和连接数据。
YQL将充当中间人,将来自您网站的呼叫连接到您的API。网络流量看起来像这样:
Client -> YQL -> API Server
对我来说很好看。
YQL已存在很长时间了。他们的free quotas是有利的,正常运行时间也很好:
每个IP限制:/ v1 / public / :每小时2,000次通话; / v1 / yql / :每小时20,000次通话。
YQL的性能正常运行时间目标超过99.5%。
此外,配额不断增加,雅虎!提供某些保证,如果他们决定关闭服务,他们将保持运行一段时间,以便您有时间迁移。今天有几个项目使用YQL(我知道有一个这样的服务 - TipTheWb.org)
此外,我建议您检测某个浏览器是否仅在必要时支持CORS并回退到YQL:
function browserSupportsCors() {
if ("withCredentials" in new XMLHttpRequest())
return true; // most browsers
else if (typeof XDomainRequest == "object")
return true; // IE8+
else // Opera currently here, but they'll get better pretty soon :)
return false;
}
或者如果你使用jQuery,它有一个整洁的support
方法。
if (!$.support.cors) {
// YQL fallback
}
还有很棒的tips to tweak YQL performance。
感谢您关心Opera用户!
答案 1 :(得分:0)
最常见的解决方案确实是在您的服务器上使用代理脚本。
带宽很可能是微不足道的 - 我们谈论的是小型请求,毕竟不是大量下载 服务器负载也是最小的 - 你总是可以使用异步和轻量级的东西,比如node.js来减少负载。