AngularJS:如何做一个jsonp请求
我需要做一些跨站点脚本。 下面的代码块包含jsonp的方法,该方法返回,如果它失败,但是当我改变它是一个获取请求,然后成功。 我需要能够使用jsonp方法成功响应。 以下可以排除。 响应是有效的json和这个参数是在url?callback = JSON_CALLBACK。 这里是我从做HTTP请求和执行此代码的代码块收到的JSON。
http响应状态码200
[{"cube":"1" ,"points":"160"},{"cube":"2","points":"690"},{"cube":"3","points":"331"}]
代码块
var myApp = angular.module('test', []); myApp.controller('UserCtrl', function($scope, users) { $scope.usersPerCube = users.getUsers(); }) myApp.factory('users', function($http) { return { getUsers: function() { var deferred = $q.defer(); var url = "http://localhost/api/api/index.php/analytics/UsersPerCube?callback=JSON_CALLBACK"; $http.get(url).success(function (data, status, headers, config) { console.log(data); deferred.resolve(data); }).error(function (data, status, headers, config) { //this always gets called console.log(status); deferred.reject(status); }); return deferred.promise; } }
请注意,我编辑了我的服务器端代码,现在收到
"angular.callbacks._1( {"cube":"1","points":"160"},{"cube":"2","points":"690"},{"cube":"3","points":"331"})"
更新上面是有效的,现在成功的方法正在执行。 我只需要弄清楚如何parsing对象。 一旦我找出答案,我会再次发布。
我已经决定详细描述如何做jsonp请求,这样其他人就不会像我那样遇到同样的麻烦了。
myApp.factory('users', function($http) { return { getUsers: function() { var deferred = $q.defer(); var url = "http://localhost/api/api/index.php/analytics/UsersPerCube?callback=JSON_CALLBACK"; $http.get(url).success(function (data, status, headers, config) { console.log(data); deferred.resolve(data); }).error(function (data, status, headers, config) { //this always gets called console.log(status); deferred.reject(status); }); return deferred.promise; }
请注意,url包含?callback=JSON_CALLBACK
。 这是一个很好的计算器。 一旦你得到回应,那么你会收到一个像下面的JSON。
"angular.callbacks._1( {"cube":"1","points":"160"},{"cube":"2","points":"690"},{"cube":"3","points":"331"})"
这个主题是一个很好的stackoverflow
现在得到我的一部分是服务器必须返回GET
参数, callback
。 这是一个很好的教程。 http://niryariv.wordpress.com/2009/05/05/jsonp-quickly/所以JSON看起来像上面那个。;
那么,我希望这将有助于未来的人。
如果你想通过$ http服务发出几个JSONP请求,你应该使用一些小技巧。 Agular将JSON_CALLBACK更改为内部值,以及使用下一个解决scheme的最佳方法:将此js代码放入返回的js文件中:
var callbackId = '_' + (angular.callbacks.counter - 1).toString(36); angular.callbacks[callbackId](/* YOUR JSON */);
为了确保这个代码可以为你工作,请检查angular度来源中的createHttpBackend方法。