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 ответ:
Проблема, с которой вы столкнулись, заключается в том, что 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-адреса без конечной косой черты.