在使用AngularJS的$ http服务时,我发现很难管理所有后端网址 - 它们都是围绕控制器的代码传播的。有时它们甚至是重复的。大部分都是$http.get('/api/something').then(...)
的形式。
将所有这些服务放入不同的服务听起来非常不合理:它只是一行代码,可能只是很小的修改(比如添加标题等)。
其他解决方案可能会将它们放入常量中,但在这种情况下,我仍然会使用$http.get(APIURLs.SomeURL)
看起来有点冗长......
所以问题是:管理后端URL的最佳方法是什么?
答案 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();
希望这澄清了它。我赶时间,所以请问更具体,我稍后会提供更多的例子。