【问题标题】:HTTP Status 0 from AngularJS Get for JSON来自 AngularJS 的 HTTP 状态 0 获取 JSON
【发布时间】:2013-07-29 14:00:08
【问题描述】:

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

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。

【问题讨论】:

    标签: json angularjs http


    【解决方案1】:

    只是为了说明这一点,因为上面的答案中没有直接说明(而是在它的 cmets 中),并且像我一样,一些 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 集成的任何人补充此答案

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

    • 在 [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/

    【讨论】:

    • 请注意,Angular 本身不会发出 OPTIONS/preflight 请求。浏览器可以。事实上,Angular 并不知道这个请求,它对客户端代码是完全透明的。
    • @ray-nicholus 很有趣。你能指出这方面的任何参考资料吗?
    • 这是CORS的一个基本概念。您在很多地方都读到过 CORS,例如 CORS specthis MDN article
    • 对我来说,起作用(或在与我们的 API 开发人员交谈时提供催化剂)的事情是缺少 CORS 标头。所有有效的请求都有这些标头,他的非工作请求(浏览器说 404,角度说 0)没有这些标头。谢谢!
    • 顺便说一句,我今天在为 iOS9 构建具有 ionic/angular 和 laravel 后端的应用程序时遇到了这个问题。苹果传输层安全性的问题是双重的。下面的链接和上面的答案帮助了我stackoverflow.com/questions/31254725/…
    【解决方案2】:

    在您的代码中,状态分配仅在发生错误时发生。成功拨打电话后,您应该能够像这样获得状态:

    success(function(data, status, headers, config) {
        $scope.objects = data;
        $scope.status1 = status;
    }).error(function(data, status) {
        $scope.status1 = status;
    });
    

    【讨论】:

    • 但是当它确实从本地获取相同的 json 时,它仍然会引发错误并且实际上并没有从服务器中获取内容。估计status 0代码没有我想的那么重要,真的是获取json失败。
    • 从服务器上拉它?确保您没有调用托管在另一个域上的 API。由于javascript默认不允许跨域API调用。
    • 这听起来就像正在发生的事情。谢谢你。在将其推送到服务器之前,我将使用本地文件。
    • 没问题。如果您对如何使跨域调用工作感兴趣,可以查看此thread
    • 我有完全相同的问题。但我尝试从此处给出的 w3schools 测试 url 中提取数据。 w3schools.com/angular/angular_http.asp 这个w3schools.com/angular/angular_http.asp 服务网址为我的本地角度应用程序加载数据。似乎角度现在允许跨域api调用。我的问题是什么?
    【解决方案3】:

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

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

    智者的话。

    【讨论】:

      猜你喜欢
      • 2017-05-13
      • 1970-01-01
      • 2016-02-05
      • 2018-07-04
      • 1970-01-01
      • 2015-01-12
      • 1970-01-01
      • 2015-01-24
      • 2017-03-13
      相关资源
      最近更新 更多