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

时间:2012-04-05 20:49:58

标签: ajax backbone.js cross-domain cors

我正在开发一个backbone.js项目,我正在调用我的github repo。我有我的Collections和Models bootloaded,所以当我的页面构建时它们就存在了,但是当我调用model.fetch()时,我得到这样的信息:(用户名替换:用户名)

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

我已经阅读了一些消息post1post2,他们提到修改了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();
},

谢谢!

2 个答案:

答案 0 :(得分:4)

后端启用了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 Documentation on Access-Control

<小时/> 的修改

话虽如此,如果您需要通过骨干修改jQuery提出的请求,则无需覆盖sync方法。使用jQuery's $.ajaxSetup方法添加任何其他标头,设置类型等。只需确保在与$.ajaxSetup.save()相同的上下文或闭包中运行.fetch()方法或.destroy()将会运行,或者您无法在$.ajaxSetup

中执行工作

答案 1 :(得分:0)

我最近遇到过类似的问题,最后使用 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问题!]