11

我正在为 JSON 运行 $http.get 并且状态为 0。我已经下载了相同的 JSON 并且 get 在本地工作,并且在 Python 中使用 requests 库我可以获得 JSON 没问题,但是在AngularJS 它不工作。我不明白为什么 Angular 没有得到它,但其他一切都是。下面的代码片段。

function AgentListCtrl($scope, $http) {
  $http.get('http://foo.bar/api/objects').success(function(data) {
  $scope.objects = data;
}).error(function(data, status) {
  $scope.status1 = status;
});

这会提供 JSON 并在使用本地文件时对其进行解析,否则会失败并将 status1 设置为 0。

4

3 回答 3

21

只是为了说明这一点,因为上面的答案没有直接说明(但在其评论中),并且像我一样,一些 Angular 新手可能会花一些时间在这上面:

  • Angular 的 $resource 将能够在另一台服务器上执行 REST 动词,而后者又会正确响应(带有status 200)。尽管如此,Angular 还是会失败并显示一条可以通过状态 0 识别的神秘消息。这会进一步误导,因为在浏览器的调试器中,您实际上可能会看到服务器的答案。

  • 除非另有说明,否则Angular 将对OPTIONS跨域请求进行请求(至少对于默认query()方法)。通常,服务器不会回答所需的内容(即您的表示)。为每个请求执行此操作的一种简单方法是将方法指定为'GET'.

    $resource('http://yourserver/yourentity/:id', {}, {query: {method: 'GET'});
    
  • 响应您的 REST 请求的服务器必须包含 CORS [1] 指定的标头,以允许 Angular 正确使用响应。本质上,这意味着Access-Control-Allow-Origin在您的响应中包含标头,指定请求来自的服务器,这是允许的。这个值可能是*

为将 AngularJS 与 spring-data-rest-webmvc 集成的任何人补充此答案

  • Angular 不会正确使用 HATEOAS json 格式的响应,而是产生错误Expected response to contain an array but got an object。这可以通过将isArray: false参数添加到$resouce的配置中来解决;

  • 在 [2] 中介绍了为 spring-data-rest-webmvc 场景配置 CORS 的一个非常中肯的示例(请参阅参考资料SimpleCORSFilter

[1] https://developer.mozilla.org/en/docs/HTTP/Access_control_CORS

[2] https://spring.io/guides/gs/rest-service-cors/

于 2014-02-25T17:41:29.873 回答
2

在您的代码中,状态分配仅在发生错误时发生。当呼叫成功时,您应该能够获得状态,如下所示:

success(function(data, status, headers, config) {
    $scope.objects = data;
    $scope.status1 = status;
}).error(function(data, status) {
    $scope.status1 = status;
});
于 2013-07-29T17:31:30.407 回答
1

我自己也有类似的问题。当通过 Angular 的 $http.get() 方法调用时,通过其他方式返回 JSON 的第三方 API 以状态 0 失败。

就我而言,没有任何 CORS 问题。相反,我用于 API 的 URL 不太正确,服务器发出了 301 响应。Angular 不尊重重定向。

给智者的话。

于 2015-11-12T05:35:17.233 回答