如何使用CORS和backbonejs向API发出ajax请求



我正在处理一个backbone.js项目,我正在调用我的github repo。我已经启动了我的集合和模型,所以一旦我的页面构建完成,它们就会存在,但当我调用model.fetch()时,我会收到这样的消息:(用用户名替换:username)

XMLHttpRequest cannot load https://api.github.com/users/:username.
Origin http://mydomain.com is not allowed by Access-Control-Allow-Origin.

我读过一些post1、post2的消息,它们提到修改backbone.sync函数,但我不完全确定如何修改。这是我到目前为止的代码(这是在我的Backbone.Router中):

userDetails: function(id) {
    console.log('Loading: userDetails');
    var User = Users.get(id);
    User.fetch({dataType: "jsonp"});
    console.log(User);
    userView = new UserView({
        model: User
    });
    userView.render();
},

谢谢!

CORS在后端启用。jQuery基础知道何时发出跨来源请求,并相应地进行修改。问题是服务器,在这种情况下,api.github.com不允许CORS请求。

服务器必须(至少)回复:

Access-Control-Allow-Origin: * (or the host in which your page is being served)

由于您可能没有github,您必须编写一个服务器端代理,或者查看github是否可以为您提供JSONP调用(jQuery也很乐意为您提供)。

访问控制的MDN文档


编辑

也就是说,如果您需要修改jQuery通过主干网发出的请求,则不需要重写sync方法。使用jQuery的$.ajaxSetup方法添加任何额外的头、集合类型等。只需确保在.save().fetch().destroy()将要运行的上下文或闭包中运行$.ajaxSetup方法,否则将无法在$.ajaxSetup 中执行工作

我最近遇到了类似的问题,最终使用了mod_proxy。请参阅:http://blog.lakmali.com/2010/11/apache-proxy-configuration-and-load.html这篇博文非常清晰明了。

mod_proxy也支持"https",但我自己还没有尝试过!请在谷歌上搜索更多关于代理选择的信息,如mod_Proxy、mod_jk等。

通过使用mod_proxy,我们不再需要进行任何跨域调用。因此,无需担心IE8/IE9的XDomainRequest用于执行跨域请求的黑客攻击。[注意:在使用*mod_proxy*之前,我们试图超越Backbone.sync来显式调用XDomainRequest,而不是jQuery的ajax,以解决IE9上的CORS问题!]

相关内容

  • 没有找到相关文章

最新更新