无法在回调AngularJS中访问JSON响应

时间:2013-09-15 00:55:18

标签: javascript angularjs

在我的网络标签中,我看到回复的回复但由于某种原因我无法访问数据。

以下是直接链接: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?
});

2 个答案:

答案 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;
}