Запрос отсутствующих опций с использованием данных ember-data
Я пытаюсь справиться с данными ember и ember, но имею проблему с правильной обработкой CORS.
Мне удалось определить модель и т.д. с помощью статического прибора, но теперь я хочу использовать какой-то удаленный JSON. Поэтому я настраиваю такие данные:
App = Ember.Application.create();
App.Store = DS.Store.extend({
revision: 13,
adapter: DS.RESTAdapter.create({
url: 'http://clara.eagle/v1/money'
})
});
Модель, подобная этой:
App.Transaction = DS.Model.extend({
type: DS.attr('string'),
occurrence: DS.attr('date'),
details: DS.attr('string'),
amount: DS.attr('number'),
currency: DS.attr('string')
});
И такой маршрут:
App.IndexRoute = Ember.Route.extend({
model: function() {
return App.Transaction.find();
}
});
В качестве backend у меня есть существующий API, который вернет JSON для действительного GET
запроса следующих заголовков CORS OPTIONS
.
Access-Control-Allow-Origin: http://ember.eagle
Access-Control-Allow-Headers: X-Requested-With, X-AUTHENTICATION, X-IP
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
(ember.eagle - домен домена ember, clara.eagle - домен api).
Когда я запускаю приложение, однако хром говорит мне:
XMLHttpRequest cannot load http://clara.eagle/v1/money/transactions. Origin http://ember.eagle is not allowed by Access-Control-Allow-Origin.
Итак, я посмотрел вкладку сети, чтобы узнать, какой результат дал запрос OPTIONS
, за исключением того, что я мог ее найти. Хотя это объясняет, почему запрос API был неудачным, я не знаю, почему запрос OPTIONS
не выполняется, поскольку он в конечном итоге делает запрос с помощью jQuery (как я понимаю).
Итак, почему мой запрос OPTIONS
не генерируется? и если он не предназначен для того, как я могу это сделать?
Я тестировал, что запрос OPTIONS
генерируется API и что запрос GET
также работает, поэтому я не верю, что API неисправен (скриншот). Используя jQuery самостоятельно (т.е. Ванильный jQuery), запрос OPTIONS
запускается, как ожидалось.
Я новичок в Ember os, возможно, что-то мне не хватает, но на данный момент я не вижу его!
Ответы
Ответ 1
Вы можете попробовать следующие два изменения:
App.Store = DS.Store.extend({
revision: 13,
adapter: DS.RESTAdapter.create({
url: 'http://clara.eagle/v1/money',
corsWithCredentials: true
})
});
Кроме того, добавьте это в конфигурацию вашего сервера Access-Control-Allow-Credentials: true
, это связано с опцией corsWithCredentials
для настройки ajax:
Access-Control-Allow-Origin: http://ember.eagle
Access-Control-Allow-Headers: X-Requested-With, X-AUTHENTICATION, X-IP
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Надеюсь, что это поможет.
Ответ 2
На стороне клиента:
Ember.$.ajaxSetup({
beforeSend: function(xhr) {
xhr.setRequestHeader('X-IP', 'some value');
}
});
или
Ember.$.ajaxSetup({
headers: { 'X-IP': 'some value' }
});
На стороне сервера, отвечая на метод options
:
Access-Control-Allow-Origin: http://ember.eagle
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-Requested-With, X-Prototype-Version, X-IP
Access-Control-Max-Age: 1728000