来自AngularJS的HTTP状态0获取JSON

时间:2013-07-29 16:56:37

标签: json angularjs http cors

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

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.

3 个答案:

答案 0 :(得分:21)

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

  • Angular的$资源将能够在另一台服务器上执行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/

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

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

向智者说话。