分组后端API

时间:2013-03-25 13:42:46

标签: angularjs angularjs-service

在使用AngularJS的$ http服务时,我发现很难管理所有后端网址 - 它们都是围绕控制器的代码传播的。有时它们甚至是重复的。大部分都是$http.get('/api/something').then(...)的形式。

将所有这些服务放入不同的服务听起来非常不合理:它只是一行代码,可能只是很小的修改(比如添加标题等)。

其他解决方案可能会将它们放入常量中,但在这种情况下,我仍然会使用$http.get(APIURLs.SomeURL)看起来有点冗长......

所以问题是:管理后端URL的最佳方法是什么?

3 个答案:

答案 0 :(得分:2)

目前我想出了将它们分组为服务并将它们作为对$ http的调用公开的想法。这是我的解决方案: http://plnkr.co/edit/VjqXHBV54bmjKCuGJ4qX?p=preview

服务:

.factory('AdminAPI', function($http) {
   var apiMap = {
     'DeleteAuth': {url:'/api/oauth/delete',method:'PUT'},
     'GetInvalidUser': {url:'/api/users/invalid',method:'GET'},
     'CreateItem': {url:'/api/items/create',method:'POST'}     
   };
   var api = {};  
   var prepareCall = function(config) {
     return function(params) {  
       var requestConfig = angular.copy(config);
       if (config.method=='GET')
          requestConfig.params = params;
       else 
          requestConfig.data = params;       
       return $http(requestConfig);
     };
   };
   for(var name in apiMap) 
     api[name] = prepareCall(apiMap[name]);   
   return api;
});

在控制器中,我做了类似的事情:

AdminAPI.DeleteAuth({data:123}).then(function(result) {
  //
});

在这种情况下,我有一些抽象(不必将$http注入控制器),因此单元测试变得更容易一些(我不必使用$ httpBackend服务,只需模拟我的服务调用)

答案 1 :(得分:0)

使用角度Module.constant

  • 将可重复使用的设置移至单个对象;
  • 定义包装此对象的角度模块:

    angular.module('myApp.constants', []).constant('config', {
        ROUTES: {
           home: '/home.html',
           about: '/about.html'
        }
    });
    
  • myApp.constants模块加载到应用程序中与其他所有模块一起使用:

    angular.module('myApp', [
        'myApp.constants',
        'myApp.services',
        'myApp.controllers',
        'myApp.filters',
        'myApp.directives'
    ]);
    

之后,您可以注入config依赖项并访问已定义的哈希值。

答案 2 :(得分:0)

好问题。我建议的方法是将常量放在这样的constant声明中:

angular.module('fooApp').constant('config', {
                                      api: {
                                        baseUrl: 'http://api.example.com/api',
                                        key: 'SECRET_API_KEY',
                                      }
});

你可以实现一个httpResourceFactory,它负责使用config中定义的常量创建指向不同端点的$ http或$ resource引用。 这可以在服务中实现。

然后可以将所有API端点定义放入单个服务中。

angular.module('fooApp').factory('dataService', ['httpResourceFactory',  function(httpResourceFactory) {

    var PUBLIC_API = {};

    PUBLIC_API.Orders = httpResourceFactory('/orders/:id');
    PUBLIC_API.Users = httpResourceFactory('/some-url/users/:id');


    return PUBLIC_API;

  }]);

然后在您的控制器中,您可以注入dataService并执行以下操作:

$scope.users = dataService.Users.query();

希望这澄清了它。我赶时间,所以请问更具体,我稍后会提供更多的例子。