Запрос отсутствующих опций с использованием данных 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