2013-07-29 23 views
11

我正在爲JSON運行$ http.get並獲得狀態0.我已經下載了相同的JSON,並在本地獲得了作品,並且在Python中使用請求庫我可以得到JSON沒有問題,但在AngularJS中它不起作用。我不明白的是爲什麼角度沒有得到它,但一切都是如此。下面的代碼片段。來自AngularJS的HTTP狀態0獲取JSON

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

回答

2

在你的代碼,在錯誤發生時的狀態分配只發生。你應該能夠得到在呼叫成功了這樣的狀態:

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

但它仍然提出了一個錯誤,並沒有真正從服務器拉它的時候得到的內容,當它從本地得到相同的JSON就好了。我想狀態0代碼並不像我想象的那麼重要,它實際上是無法獲得json。 –

+1

從服務器拉它?確保你沒有調用託管在另一個域上的API。由於JavaScript默認情況下不允許跨域API調用。 – zsong

+0

這聽起來像是發生了什麼。謝謝。我將使用本地文件,直到將其推送到服務器。 –

20

只是爲了說明這一點,因爲不直接在上面的回答說(但在其評論)和我一樣,有些角新手可能會花費一些這方面的時間:

  • 角的$資源就能到另一臺服務器上執行REST動詞,這反過來將正確響應(與status 200)。然而,Angular會失敗並帶有一個加密的消息,可以通過狀態0來識別。這是更具誤導性的,因爲在瀏覽器的調試器中,您實際上可能會看到服務器的答案。

  • 除非有相反規定,否則角度將對跨域請求(至少對於默認的query()方法)發出OPTIONS請求。通常服務器不會回答所需的內容(即您的表示)。根據請求執行此操作的一種簡單方法是將方法指定爲'GET'

    $resource('http://yourserver/yourentity/:id', {}, {query: {method: 'GET'}); 
    
  • 服務器回答您的REST請求必須包括爲了通過CORS [1]中指定的標題,以允許角正確地消耗的響應。實質上,這意味着在響應中包含Access-Control-Allow-Origin標頭,指定允許來自請求來源的服務器。該值可能是*

補充這個答案與彈簧數據休息,webmvc人整合AngularJS:

  • 的HATEOAS JSON格式的響應將無法正確角消耗,生產,而不是錯誤Expected response to contain an array but got an object 。這可以通過將isArray: false參數添加到$resouce的配置來解決;

  • 用於彈簧 - 數據 - 其餘-webmvc場景配置CORS非常到了點例如被呈現在[2](見SimpleCORSFilter

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

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

+3

請注意,Angular不會自行生成OPTIONS /預檢請求。瀏覽器確實如此。事實上,Angular並不知道這個請求,它對客戶端代碼是完全透明的。 –

+0

@ ray-nicholus有趣。你能指出一些有關這方面的參考嗎? – h7r

+0

這是CORS的基本概念。您在許多地方閱讀了CORS,例如[CORS規範](http://www.w3.org/TR/cors/)或[本MDN文章](https://developer.mozilla.org/en- US/docs/HTTP/Access_control_CORS) –

1

我自己也有類似的問題。通過Angular的$ http.get()方法調用時,通過其他方式返回JSON的第三方API可以通過狀態0失敗。

在我的情況下,沒有任何CORS問題。相反,我用於API的URL並不完全正確,服務器發出301響應。 Angular不尊重重定向。

給智者的話。