从angularjs调用Rest API的最佳方法是什么?

unk*_*its 15 angularjs

应该从角度js调用REST API请求的位置?

即来自控制器,模块,服务,工厂.我完全感到困惑,它应该是正确的方法吗?

Joh*_*her 12

以下是我认为最佳做法:

  • 使用工厂服务来处理访问RESTful Web API的机制
  • 将工厂服务注入需要访问的控制器
  • 在工厂中使用promise来解析拒绝 $ http调用的响应
  • promise允许控制器确定它应如何响应RESTful调用的结果.例如,它可能想要调用Toast弹出窗口以通知用户任何问题.

这保持了数据服务层,业务逻辑和前端UI之间的良好分离.它还将任何一层更改的后果限制为其他层.

  • 感谢@John Kelleher解释.但是当你举出每个例子时,它会更清楚 (3认同)

Joe*_*ino 11

您可以使用任一资源,也可以构建实现http调用的服务.

如果您想使用资源,请记住:

  1. 包括您可以在这里找到的angular-resource.js文件
  2. 包含在您的模块声明中以包含ngResource模块依赖项,如下所示: angular.module('myApp',['ngResource'])

之后,您可以以这种方式声明资源:

function MyController($scope, $resource){
  var User = $resource('/user/:userId', {userId:'@id'});
  var user = User.get({userId:123}, function() {
    user.abc = true;
    user.$save();
  });
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您需要更深层次的粒度,请使用服务,例如

angular.module('myApp')
.factory('MyAPIService', function($http){
  var apiurl, myData;
  return {
    getData: function(){
      $http.get(apiurl)
      .success(function(data, status, config, headers){
        myData = data;
      })
      .error(function(){ //handler errors here
      });
    },
    data: function() { return myData; }
  };
});
Run Code Online (Sandbox Code Playgroud)

我发现服务很棒,因为它能够在控制器之间共享数据,因此您可以将它们注入控制器中

myapp.controller('MyController', function($scope, MyAPIService){
  $scope.data = MyAPIService.data();
  // etc.

});
Run Code Online (Sandbox Code Playgroud)

  • @maxdec是的,资源是为此目的而制作的,但并非所有API都是关于CRUD的某些对象/模型.有更复杂的场景可能会带来资源上的牵强附会. (3认同)
  • 我会使用Resources,因为它们是为此目的而制作的. (2认同)