在我的网络标签中,我看到回复的回复但由于某种原因我无法访问数据。
以下是直接链接:https://github.com/users/gigablox/contributions_calendar_data
使用Angular 1.2 rc2。尝试了几种不同的方式......
$ HTTP
var url = "https://github.com/users/gigablox/contributions_calendar_data?callback=JSON_CALLBACK";
$http.jsonp(url).success(function(data){
console.log(data);
});
$ resource
var handle = $resource('https://github.com/users/gigablox/contributions_calendar_data',{},{
get:{
method:'JSONP',
isArray: false, //response is wrapped as an array. tried true and false
params:{callback:'JSON_CALLBACK'}
}
});
handle.get().$promise.then(
function(data){
console.log(data);
}).
function(error){
console.log(error); //undefined but 200 OK on response?
});
答案 0 :(得分:3)
这里的问题是您正在请求一个平面文件,因此服务器没有将数据包装在jsonp_callback
querystring参数指定的javascript函数调用中。进一步的CORS阻止您使用$ http / xhr直接获取文件。
通常,如果使用$ http.jsonp,则指定的回调函数需要驻留在全局范围内,然后您需要对响应数据进行“重新角化”。
以下是使用wordpress api:http://jsfiddle.net/Rjfre/23/
的示例<强> HTML 强>
<div ng-controller="MyCtrl" id='ctl'>
<h2 ng-show="data">Data from callback</h2>
<pre>{{data}}</pre>
<h2 ng-show="success">Success</h2>
<pre>{{success}}</pre>
<h2 ng-hide="data">Error</h2>
<pre>{{error}}</pre>
</div>
<强> SCRIPT 强>
var myApp = angular.module('myApp', []);
function MyCtrl($scope, $http) {
$scope.name = 'Superhero';
var url = "http://public-api.wordpress.com/rest/v1/sites/wtmpeachtest.wordpress.com/posts?callback=jsonp_callback";
$http.jsonp(url).then(
function(s) { $scope.success = JSON.stringify(s); },
function(e) { $scope.error = JSON.stringify(e); } );
}
function jsonp_callback(data) {
var el = document.getElementById('ctl');
var scope = angular.element(el).scope();
scope.$apply(function() {
scope.data = JSON.stringify(data);
});
}
答案 1 :(得分:-1)
因此,如果JSONP和CORS都不可能,那么你必须用@ebt指向的服务器端代理来解决。 angularjs + php的一个例子:
$http.get('proxy.php').then(
function(res){
console.info(res);
}, function(error){
console.info(error);
}
);
PHP:
$url = 'api url';
$returned_content = get_data($url);
header('Content-Type: application/json');
echo $returned_content; //assumption the returned content is json format
function get_data($url) {
$ch = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}