2014-12-02 59 views
2

我在使用AngularJS從遠程服務器獲取遠程JSON文件時遇到了麻煩,甚至當我得到它時,我找不到方法使用這些數據。

這裏是角碼:

var artistControllers = angular.module('artistControllers', ['ngAnimate']); 

artistControllers.controller('ListController', ['$scope', '$http', function($scope, $http) { 
    $http.json('http://remotehost.mobi/temp.json'). 
     success(function(data){ 
      console.log('success'); 
      console.log(data); 
    }). 
     error(function(data, status){ 
      console.log('error'); 
      console.log('status'); 

    }); 
}]); 

通常我所得到的只是所有類型的錯誤:

  • 試圖從PHP腳本中獲取動態JSON的時候,我需要發送 回調,有時會起作用,但回調觸發了一個功能 ,它在範圍之外,所以它與我的需求無關。
  • 當試圖從.json文件中加載JSON時(例如),我得到了 錯誤。
  • 使用$ http.get時我總是得到跨域安全
    消息。

我正在尋找一種方法來從遠程服務器加載JSON數據,由PHP動態生成,角JS控制器並在該控制器內使用它。

感謝

回答

1

感謝您的幫助。我想我的問題有點不同,這就是我發佈這個解決方案的原因。

Evantualy我已經添加了一個新的報頭,以允許跨起源於我的PHP動態生成的JSON代碼:

header('Access-Control-Allow-Origin: *'); 
header('content-type: application/json; charset=utf-8'); 

這正好功能編碼前面,並返回JSON。我添加的另一件事是在發回之前格式化JSON。我發現發回「原始」未格式化的JSON會導致意想不到的問題。自PHP 5.4,你可以添加JSON_PRETTY_PRINT到json_encode:

echo json_encode($data_array, JSON_PRETTY_PRINT); 

在角碼,我查了很多組合,包括@Endless建議使用corsproxy。但發現經過這些調整後,您可以簡單地使用$http.get

希望這有助於如果有人遇到這個跨域策略的奇怪問題。

3

您需要更改服務器允許CORS(見this),或使用$http.jsonp並更改爲JSONP格式(JSON的身體包裹在一個回調函數調用)的響應。

如果您不控制遠程服務器,則可以通過自己的服務器代理請求,使其不再跨域。

1

代理,使CORS是corsproxy.com

CORE更安全然後JSONP cuz它不具有執行JavaScript代碼的方式的一個例子。從正面來看,你可以更好地控制狀態轉換/超時/進程和流產,因爲它現在已經是ajax

現在唯一的風險是你信任corsproxy.com讀取通過& updown傳遞的數據嗎?

你所要做的唯一事情是取代http://http://www.corsproxy.com/(不認爲它適用於HTTPS ...)

var artistControllers = angular.module('artistControllers', ['ngAnimate']); 

artistControllers.controller('ListController', ['$scope', '$http', function($scope, $http) { 
    $http.json('http://www.corsproxy.com/kinneret.mobi/temp.json'). 
     success(function(data){ 
      console.log('success'); 
      console.log(data); 
     }). 
     error(function(data, status){ 
      console.log('error'); 
      console.log('status'); 
     }); 
}]);