Restangular失败,包含promise和cross-origin请求

时间:2014-03-27 15:03:26

标签: django angularjs django-rest-framework restangular

我正在阅读关于Restangular的内容,并且随处可见提到Restangular承诺和Angular工作聪明,模板在这样的情况下更新:

  

由于Angular支持我们尽快设置范围变量的承诺   从服务器获取信息,它将显示在我们的模板

$scope.something = Restagular.one('something').get();

我正在尝试做同样的事情,但Restangular正在服务中,因为我想保持我的控制器清洁。当我向REST API发出请求时,Angular模板没有更新,我收到此错误:

  

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但是当我获得包含所有模板的列表(没有特定ID)时,我没有遇到任何问题。

我知道我可以尝试从服务中返回一个promise,然后从它的.then()来设置我的范围变量,但在Restangular的官方repo中提到了这个并且我想使用它,因为代码保持干净。

1 个答案:

答案 0 :(得分:2)

您遇到的问题是因为Django会自动将没有斜杠的网址重定向到包含斜杠的网址。这不是特定于框架的,正如我最近发现的it is an issue for ExtJS as well

因为您要求的网址api/templates/1没有斜杠,并且api/templates/1/正在提供API,所以Django会自动将请求从一个位置重定向到另一个位置。通常这个问题是一个问题,你只是看到控制台中发生的重定向而没有人关心,但CORS要求你拥有你请求的网址的权限,这意味着它无法重定向。 / p>

您可以通过以下两种方式解决此问题:在客户端或服务器端。


如果要在客户端上修复此问题,并保持服务器需要斜杠,则需要告诉restangular在末尾添加斜杠。 Restangular allows you to do this设置

RestangularProvider.setRequestSuffix('/');

在你的代码中,它会告诉restangular总是添加尾部斜杠。


如果您想在服务器端修复此问题,则需要停止在API中使用斜杠。这会产生令人不快的副作用,不允许任何带斜杠的请求,并且可能会破坏按预期工作的现有应用程序。 {/ 3}}在初始化路由器时设置trailing_slash=False

router = SimpleRouter(trailing_slash=False)

这将告诉Django REST Framework注册所有不带斜杠的URL。