AngularJS $http.get 报告 XMLHttpRequest 失败

AngularJS $http.get reports XMLHttpRequest failure

我正在尝试学习在 AngularJS 中为我​​正在编写的网络应用程序使用 $http.get 请求。我有一个本地托管的服务器,其中包含一些我编写的 API。当我尝试 运行 我的 Angular 页面时,我可以在服务器的控制台中看到已发出 GET 请求,但浏览器中没有加载任何内容。检查浏览器的控制台后,我发现此错误消息:

XMLHttpRequest cannot load http://127.0.0.1:8080/api/range/?nmax=5&a_max=100&b_max=200, No 'Access-Control-Allow-Origin' header is print on the requested resource. Origin 'null' is therefore not allowed access.

服务器端我是 运行ning Python CherryPy 服务器,它将向上面的 url 和 return 一个 JSON 字符串发送 GET 请求看起来像这样:

[
    {
        "a": 5.6,
        "b": 3.2
    },
    {
        "a": 4.3,
        "b": 2.6
    }
]

这是我的 Angular 代码,目前它尽可能基本:

<!DOCTYPE html>
<html>
<head>
<script src= "http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>
</head>
<body>

<div ng-app="myApp" ng-controller="Ctrl"> 

<ul>
  <li ng-repeat="x in peakdata">
    {{ x.a + ', ' + x.b }}
  </li>
</ul>

</div>

<script>
var myApp = angular.module('myApp', []);

myApp.controller('Ctrl', function($scope, $http) {
  $http.get('http://127.0.0.1:1234/api/range/?nmax=5&a_max=100&b_max=200')
    .then(function(response){
      $scope.peakdata = response.data;
    }, function(err) {
      throw err;
    });
});
</script>

</body>
</html>

如有任何建议,我们将不胜感激!

谢谢,肖恩。

编辑:原来我不得不对我的 AngularJS 代码和 CherryPy 脚本进行修改。详情请看我的回答。

我相信上一个问题可能有您要找的答案: Origin null is not allowed by Access-Control-Allow-Origin.

这是你在本地做事时出现的问题,所以我相信这不是你没有正确使用Angular:)

经过进一步的研究和摆弄,我终于找到了解决方案。我需要让 CORS 启用我的 AngularJS 应用程序。以下代码就足够了:

myApp.config(function($httpProvider) {
    $httpProvider.defaults.useXDomain = true;
    delete $httpProvider.defaults.headers.common['X-Requested-With'];
});

在大多数情况下,他们的问题到此为止。但是,由于我是 运行 我自己的 CherryPy 服务器,所以我还有一些事情要做。我必须在我的 CherryPy Python 脚本中启用 CORS。这些 questions/answers 相对于这样做是很好的资源:

“no 'Access-Control-Allow-Origin' header is present” error with Cherrypy

cherrypy/jquery CORS trouble

对于想知道 "CORS" 到底是什么的人来说,它代表 "Cross-Origin Resource Sharing"。维基百科页面是不错的阅读方式:https://en.wikipedia.org/wiki/Cross-origin_resource_sharing