使用AngularJS将HTTP请求发送到另一个域

时间:2016-09-07 20:34:45

标签: angularjs django rest request

我一直在使用django-rest-framework开发API。

但是,当我在localhost上运行虚拟Web服务器并尝试向api发送请求时,我收到此错误

XMLHttpRequest cannot load http://127.0.0.1:8000/users?format=json. No ' Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.

快速搜索后我意识到,问题是我发送请求到不同的域(在我的情况下不同的端口),我可以通过安装一些新的应用程序来修复它。但是,我不想在django中这样做,而是通过编辑我提出请求的方式。这就是我现在的表现:

Geonix.controller('mainController', function($scope, $http) {
          var config = { headers: {'Content-Type': 'application/json; charset=utf-8'}};
            $http.get('http://127.0.0.1:8000/users?format=json', config).success(function(data) {
                $scope.users = data;
            });
        });

有没有办法在不改变后端的任何内容的情况下获得正确的响应?注意,在实际的服务器api和网页上也会在不同的端口上运行,因此问题就会存在。

3 个答案:

答案 0 :(得分:2)

您应该使用django-cors或者您可以使用JSONP,但它只接受获取请求。

答案 1 :(得分:1)

正如其他人所说,你应该真正考虑使用django-cors-middleware

如果你有正确的Auth方法,或者API应该是公开的,你可以继续在settings.py上设置CORS_ORIGIN_ALLOW_ALL = True以获得超快的解决方案。我担心除此之外别无他法。

我曾经通过在<img>标签中加载一些路线来绕过CORS,但是当我几乎无法控制服务器时,我必须尽快运行一个非常具体的概念证据,这是一种超级黑客方法。在这种情况下,我只需触摸服务器执行某些操作的路由,它就是Node.js服务器。我不要建议您尝试破解CORS,特别是考虑使用django-cors-middleware是多么容易。

作为补充说明,不再维护django-cors-headers。如果您的Django安装版本是1.10或更高版本,则需要使用django-cors-middleware。

答案 2 :(得分:0)

Angular正在您的Django应用程序上执行飞行前OPTIONS请求,但是在Django上没有启用CORS。如果你能够在Django中激活CORS,你将为自己省去很多麻烦。

另一个选择是使用JSONP,再次是你必须在Django中进行的配置更改。

但问题是关于在不修改Django的情况下发出请求。

在这种情况下,启用了预飞行,因为您的内容类型是“application / json”。如果您将其更改为“text / plain”,Angular将跳过飞行前并拨打电话。

由于结果数据是纯文本,您可以将其转换为JSON.parse()的对象:

var config = { headers: {'Content-Type': 'text/plain; charset=utf-8'}};
$http.get('http://127.0.0.1:8000/users?format=json', config).success(function(data) {
  $scope.users = JSON.parse(data);
});