Restangular терпит неудачу с обещанием и запросами перекрестного происхождения


Я читаю о Restangular и везде упоминается, что Restangular обещает и Angular работает умно, и шаблон обновляется в ситуациях, подобных этой:

Поскольку угловая поддержка установки обещает охватить переменные, как только мы получите информацию с сервера, она будет показана в нашем шаблоне

$scope.something = Restagular.one('something').get();
Я пытаюсь сделать то же самое, но Restangular находится в службе, потому что я хочу, чтобы мои контроллеры были чистыми. Когда я обращаюсь с просьбой к мой REST API угловой шаблон не обновляется, и я получаю эту ошибку:

XMLHttpRequest не может загрузить http://localhost:3000/api/template/1. Запрос был перенаправлен на 'http://localhost:3000/api/template/1/', что запрещено для запросов перекрестного происхождения, требующих предварительной подготовки.

Вот мой код: на службе...

myAppServices.service('TemplateService', ['$http', '$cookies', '$cookieStore', Restangular',
                       function($http, $cookies, $cookieStore, Restangular) {

    Restangular.setBaseUrl(constants.serverAddress);

    var getTemplate = function(templateId) {
        // Check the input
        if (!isValidId(templateId))
            return;

        return Restangular.one('api/template', templateId).get();
    };

    // Public getters
    this.getTemplate = getTemplate;
}]);

В контроллере..

$scope.currentCard =  TemplateService.getTemplate(1);
Так где же проблема в данном случае - на клиенте или на сервере. Для моего API я использую django-rest-framework , но У меня нет проблем, когда я получаю список со всеми шаблонами (без определенного идентификатора). Я знаю, что могу попытаться вернуть обещание от службы и от ее имени .затем (), чтобы установить мою переменную scope, но в официальном РЕПО Restangular упоминается это, и я хочу использовать его, потому что код остается чистым.
1 3

1 ответ:

Проблема, с которой вы столкнулись, заключается в том, что Django автоматически перенаправляет URL-адреса без косой черты на URL-адреса с косой чертой. Это не специфично для фреймворка, как я недавно обнаружил это проблема для ExtJS, а также.

Поскольку вы запрашиваете url-адрес api/templates/1 без конечной косой черты, а API обслуживается в api/templates/1/, Django автоматически перенаправляет запросы из одного места в другое. Обычно эта проблема является проблемой, вы просто видите, что перенаправление происходит в консоль и никто не заботится, но CORS требует, чтобы у вас было разрешение на url, который вы запросили, что означает, что он не может перенаправить.

Вы можете исправить это двумя различными способами: на стороне клиента или на стороне сервера.


Если вы хотите исправить это на стороне клиента и сохранить сервер, требующий косых черт, вам нужно сказать restangular, чтобы добавить косую черту в конец. Restangular позволяет сделать это , установив

RestangularProvider.setRequestSuffix('/');

В вашем коде, который скажет restangular всегда добавлять косую черту в конце.


Если вы хотите исправить это на стороне сервера , Вам нужно будет прекратить требовать косых черт в вашем API. Это имеет неприятный побочный эффект , не позволяя никаких запросов с косой чертой , и может сломать существующие приложения, которые работают, как ожидалось. Django Rest Framework позволяет сделать это на уровне маршрутизатора , установив trailing_slash=False при инициализации обращать в бегство.

router = SimpleRouter(trailing_slash=False)

Это позволит Django Rest Framework зарегистрировать все URL-адреса без конечной косой черты.