3

我在域 api.example.com 上有一个 REST API 服务。并且想将此 api 也用于我在 www.example.com 上的 javascript ajax 请求。

我使用 CORS 构建了我的 jQuery AJAX 请求(GET、POST、PUT 和 DELETE),并且在 firefox 和 chrome 上一切正常。我在 Opera 上测试了脚本,但没有加载任何内容。之后,我阅读了一些在线文章,不得不意识到 CORS 不适用于 Opera。

获取数据并将数据放入 Rest 服务有哪些替代方法?JSONp 不起作用,因为我也需要其他 HTTP 动词(POST、PUT、DELETE)。

在同一个域上创建一个“隧道”php-Script?但是,我有更多的网络流量和服务器负载。

Client -> WWW-Server -> API-Server
API-Server -> WWW-Server -> Client

代替

Client -> API-Server
API-Server -> Client

我感谢每一个将与我分享的想法。

4

2 回答 2

3

您可以使用第三方工具进行隧道传输,例如YQL

雅虎!查询语言是一种表达能力强的类 SQL 语言,可让您跨 Web 服务查询、过滤和连接数据。

YQL 将充当中间人,将来自您的站点的调用连接到您的 API。网络流量如下所示:

Client -> YQL -> API Server

这对我来说看起来不错。

YQL 已经存在了很长时间。他们的免费配额很有利,正常运行时间也很长:

  • 每个 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
}

还有一些很好的技巧来调整 YQL 性能


感谢您对 Opera 用户的关心!

于 2012-05-14T10:15:24.050 回答
0

最常见的解决方案确实是在您的服务器上使用代理脚本。

带宽很可能可以忽略不计——我们谈论的是小请求,毕竟不是大下载。
而且服务器负载也很小——你总是可以使用一些异步和轻量级的东西,比如 node.js 来进一步减少负载。

于 2012-05-14T09:38:36.247 回答