一尘不染

如何在AngularJS中正确使用HTTP.GET?具体来说,是否需要外部API调用?

angularjs

我在controller.js中有以下代码,

var myApp = angular.module('myApp',[]);

myApp.service('dataService', function($http) {
delete $http.defaults.headers.common['X-Requested-With'];
this.getData = function() {
    $http({
        method: 'GET',
        url: 'https://www.example.com/api/v1/page',
        params: 'limit=10, sort_by=created:desc',
        headers: {'Authorization': 'Token token=xxxxYYYYZzzz'}
     }).success(function(data){
         return data
    }).error(function(){
        alert("error");
    });
 }
});

myApp.controller('AngularJSCtrl', function($scope, dataService) {
  $scope.data = dataService.getData();
});

但是,我想我可能在CORS相关问题上犯了一个错误。您能给我指出拨打电话的正确方法吗?非常感谢!


阅读 191

收藏
2020-07-04

共1个答案

一尘不染

首先,您的success()处理程序仅返回数据,但getData()由于已在回调中,因此不会返回给调用方。
$http是一个返回的异步调用$promise,因此您必须为数据可用时注册一个回调。

我建议在AngularJS中查找Promises和$
q库
,因为它们是在服务之间传递异步调用的最佳方法。

为简单起见,这是您的相同代码,但使用调用控制器提供的函数回调函数进行了重写:

var myApp = angular.module('myApp',[]);

myApp.service('dataService', function($http) {
    delete $http.defaults.headers.common['X-Requested-With'];
    this.getData = function(callbackFunc) {
        $http({
            method: 'GET',
            url: 'https://www.example.com/api/v1/page',
            params: 'limit=10, sort_by=created:desc',
            headers: {'Authorization': 'Token token=xxxxYYYYZzzz'}
        }).success(function(data){
            // With the data succesfully returned, call our callback
            callbackFunc(data);
        }).error(function(){
            alert("error");
        });
     }
});

myApp.controller('AngularJSCtrl', function($scope, dataService) {
    $scope.data = null;
    dataService.getData(function(dataResponse) {
        $scope.data = dataResponse;
    });
});

现在,$http实际上已经返回了一个$ promise,因此可以将其重写:

var myApp = angular.module('myApp',[]);

myApp.service('dataService', function($http) {
    delete $http.defaults.headers.common['X-Requested-With'];
    this.getData = function() {
        // $http() returns a $promise that we can add handlers with .then()
        return $http({
            method: 'GET',
            url: 'https://www.example.com/api/v1/page',
            params: 'limit=10, sort_by=created:desc',
            headers: {'Authorization': 'Token token=xxxxYYYYZzzz'}
         });
     }
});

myApp.controller('AngularJSCtrl', function($scope, dataService) {
    $scope.data = null;
    dataService.getData().then(function(dataResponse) {
        $scope.data = dataResponse;
    });
});

最后,还有更好的方法来配置$http服务以处理用于config()设置的标头$httpProvider。请查看$
http文档
以获取示例。

2020-07-04