Запрос извлечения из магистрали – это метод OPTIONS.

У меня есть объект Backbone Collection со следующим URL-адресом «http://localhost:8080/api/menu/1/featured». Я пытаюсь выполнить операцию выборки, чтобы получить коллекцию из URL-адреса и проанализировать ее. Однако на стороне сервера тип метода, который я вижу для этого запроса, — OPTIONS. Предполагается, что сервер поддерживает только метод GET. Я не уверен, как Backbone определяет, какой тип метода использовать, и почему он иногда случайным образом меняется на тип метода OPTIONS. Я использую сервер Node.js для обработки запроса. Этот код ниже в значительной степени то, что я сделал.

var FeaturedCollection = Backbone.Collection.extend({
    model:FeaturedContent,
    url:function () { return url_featured; },
    parse:function (response) {
        console.log(response);
        return response;
    }
});

var featuredCollection = new FeaturedCollection();
featuredCollection.fetch();

Пожалуйста, помогите, спасибо!


person Jeffrey Chen    schedule 02.07.2012    source источник


Ответы (4)


Прошло некоторое время, но я помню, что сталкивался с этим раньше. Это может быть две вещи: Backbone по умолчанию пытается выполнять вызовы RESTful API к вашему серверу, это означает GET, POST, PUT и DELETE.

Многие серверные части не были созданы с реальной поддержкой REST и поддерживают только GET и POST. Когда Backbone отправляет команду PUT или DELETE, ваш браузер (не Backbone) автоматически сначала отправляет запрос OPTIONS, чтобы узнать, разрешено ли ему делать такие запросы. Если ваш сервер ответит неправильно, этот вызов завершится ошибкой, и, возможно, Backbone ничего не сделает.

Чтобы обойти эту проблему, установите Backbone.emulateHTTP = true; или заставьте сервер правильно отвечать на вызовы OPTIONS. Дополнительную информацию см. в документации: http://backbonejs.org/#Sync-emulateHTTP.

Другая проблема заключается в том, что вы делаете ajax-запросы между доменами/поддоменами, и вам необходимо правильно включить CORS. Это также включает в себя правильный ответ на запросы OPTIONS.

person Mauvis Ledford    schedule 29.10.2012
comment
Я не думаю, что этот ответ правильный. У меня такая же проблема с методом save() + CORS. Мой сервер может правильно обрабатывать вызовы CORS, я пробовал использовать $.ajax и внешний тестер интерфейса REST. Теперь я отправляю вызов POST с помощью model.save(), метод запроса управления доступом - это POST, но метод - это ОПЦИИ, поэтому мой сервер смущен и отправляет заголовок 404 обратно. Я использую PHP SLIM на стороне сервера. - person inf3rno; 17.05.2013
comment
То, что это не сработало для вас, не означает, что это не помогло другим людям. Извините, я мало знаю о вашей настройке, это может быть ряд других вещей. - person Mauvis Ledford; 17.05.2013
comment
При вызовах CORS у вас есть предварительный вызов OPTIONS, и если вы плохо отвечаете на заголовки Access-Control-Request-* с заголовками Access-Control-Allow-*, ваш первоначальный запрос не будет выполнен. Это была моя проблема, но теперь я прочитал, что вы написали то же самое, так что извините меня за голосование! - person inf3rno; 19.05.2013

У меня была та же проблема, что и у OP: использование Backbone и NodeJS для сохранения данных через запрос CORS POST постоянно отправляло заголовок http-запроса OPTIONS и вообще не запускало запрос POST.

По-видимому, CORS с запросами, которые «вызовут побочные эффекты для пользовательских данных», заставят ваш браузер «предварительно проверить» запрос с заголовком запроса OPTIONS для проверки на предмет утверждения, прежде чем фактически отправить предполагаемый метод HTTP-запроса. https://developer.mozilla.org/en-US/docs/HTTP_access_control#Overview

Этот поток решил мою проблему - Как разрешить CORS?

Плакат использовал некоторое промежуточное программное обеспечение для утверждения запросов PUT/GET/POST/DELETE, например:

res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
...
next();

и следующий(); позволит продолжить проверку OPTIONS в запросе POST.

Работал как мечта для меня, надеюсь, что это поможет и кому-то еще.

person soupasouniq    schedule 05.08.2012
comment
Как насчет того, чтобы сделать что-то вроде: if request.method == "OPTIONS" return 200, чтобы указать интерфейсу, что запрос OPTIONS может быть обработан? Я использую серверную часть Python и не уверен, что существует эквивалент next(). - person benjaminz; 13.04.2016

Backbone.js сопоставляет методы CRUD с HTTP. Взято из исходного кода Backbone:

var methodMap = {
  'create': 'POST',
  'update': 'PUT',
  'delete': 'DELETE',
  'read':   'GET'
};
Backbone.sync = function(method, model, options) {
   var type = methodMap[method];

Вероятно, проблема связана с вашим бэкэндом node.js.

person eabait    schedule 03.07.2012

Какую версию магистрали вы используете? У меня была точно такая же проблема, но потом я понял, что использовал старую версию магистрали (0.3.3) в учебнике. Обновлена ​​ссылка на последнюю версию backbone.js (0.9.2) и underscore.js (1.3.3), и она отправляется как GET.

person user1004988    schedule 12.07.2012