2012-04-05 7 views
1

Я работаю над проектом backbone.js, и я называю свое репетирование github. Я имею мои коллекции и модели bootloaded так что они существуют, как только моя страница построена, но когда я называю model.fetch() Я получаю сообщение: (заменить: имя пользователя с именем пользователя)Как сделать запрос ajax API с помощью CORS и backbonejs

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(); 
}, 

Спасибо!

+1

также , дубликат [Access-Control-Allow-Origin Not Allowed by Server] (http://stackoverflow.com/questions/9327218/access-control-allow-origin-not-allowed-by) – tkone

+1

api.github.com делает поддержка jsonp. В jQuery установите ваш URL-адрес, чтобы включить 'callback =?', И он будет работать нормально. Так что ваш URL-адрес будет 'api.github.com/users/toddself?callback=?'и jQuery будет обрабатывать вызов jsonp и предоставлять данные для вашей функции успеха как обычно. – tkone

ответ

4

CORS включен на бэкэнд. Основы jQuery знают, когда он делает запрос кросс-происхождения и соответствующим образом изменяет его. Проблема заключается в сервере, в этом случае api.github.com не разрешает запросы CORS.

Сервер должен ответить (в Minumum):

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

Поскольку вы, вероятно, не владеют GitHub, вы должны либо написать на стороне сервера прокси или увидеть, если GitHub может предоставит вам вызов JSONP (который jQuery тоже рад сделать для вас).

MDN Documentation on Access-Control


EDIT

Это, как говорится, если вам нужно изменить запрос, сделанный через JQuery позвоночника, нет необходимости переопределять метод sync. Используйте метод jQuery's $.ajaxSetup, чтобы добавить любые дополнительные заголовки, типы набора и т. Д. Просто убедитесь, что вы запускаете метод $.ajaxSetup в том же контексте или в закрытии, что и .save(), .fetch() или .destroy(), или вы не получите работу, выполняемую в $.ajaxSetup

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-х Аякса для того, чтобы заботиться о вопросах CORS на IE9]