【问题标题】:Restangular fails with promise and cross-origin requestsRestangular 因承诺和跨域请求而失败
【发布时间】:2014-05-06 15:49:03
【问题描述】:

我正在阅读有关 Restangular 的信息,到处都提到 Restangular 承诺和 Angular 工作得很好,并且模板在这样的情况下正在更新:

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

$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)的列表时没有问题。

我知道我可以尝试从服务及其 .then() 返回一个承诺来设置我的范围变量,但在 Restangular 的官方仓库中提到了这一点,我想使用它,因为代码保持干净。

【问题讨论】:

    标签: django angularjs django-rest-framework restangular


    【解决方案1】:

    您遇到的问题是因为 Django 会自动将不带斜杠的 url 重定向到带斜杠的 url。这不是特定于框架的,因为我最近发现了it is an issue for ExtJS as well

    因为您请求的 url api/templates/1 没有尾部斜杠,并且 API 在 api/templates/1/ 处提供服务,所以 Django 会自动将请求从一个位置重定向到另一个位置。通常这个问题是一个问题,你只是在控制台中看到重定向并且没有人关心,但是 CORS 要求你对 你请求的 url 有权限,这意味着它不能重定向。

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


    如果你想在客户端解决这个问题,并保持服务器需要斜杠,你需要告诉restangular在末尾添加一个斜杠。 Restangular allows you to do this通过设置

    RestangularProvider.setRequestSuffix('/');
    

    在您的代码中,这将告诉 restangular 始终添加尾部斜杠。


    如果您想在服务器端解决此问题,您将需要停止在 API 中使用斜杠。这具有不允许任何带有斜线的请求的令人不快的副作用,并且可能会破坏按预期工作的现有应用程序。 Django REST Framework allows you to do this on the router level 通过在初始化路由器时设置trailing_slash=False

    router = SimpleRouter(trailing_slash=False)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      • 2011-12-19
      • 2017-12-27
      • 2015-01-28
      • 2013-10-24
      相关资源
      最近更新 更多