无法从远程服务器获取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');
});
}]);