无法从远程服务器获取JSON,使用AngularJS $ http.json /获得

问题描述:

我在使用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控制器并在该控制器内使用它。

感谢

感谢您的帮助。我想我的问题有点不同,这就是我发布这个解决方案的原因。

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

希望这有助于如果有人遇到这个跨域策略的奇怪问题。

您需要更改服务器允许CORS(见this),或使用$http.jsonp并更改为JSONP格式(JSON的身体包裹在一个回调函数调用)的响应。

如果您不控制远程服务器,则可以通过自己的服务器代理请求,使其不再跨域。

代理,使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'); 
     }); 
}]);