我们的项目有大约50个API端点。我们的api遵循Rest风格。例如,我们有4个方法的图像api:GET,POST,DELETE和PUT。
目前,我为每个端点创建了1个服务。每个服务都包含调用API的方法。我们还没有进行任何单元测试。以下是我们服务的一个示例:
export default function userApi(apiHelper, $http, $q) {
let self = this;
self.getUserData = getUserData;
self.getPhoneCodes = getPhoneCodes;
self.updateUser = updateUser;
// Implementation below
}
其他服务只是遵循这种风格。但现在我担心这种方法会产生太多的服务。
我的队友建议我们应该直接在控制器中调用$ http服务。
你认为这种方式更好吗? 提前谢谢。
答案 0 :(得分:2)
在控制器中使用$http
完全不是一个好主意。特别是在你的情况下,有很多不同的API调用。
如果您正在使用包含链接API调用的多个服务,请执行以下操作:
UserService, ProductService,...
您将所有调用存储在一个文件中。
然后,您可以轻松地在代码中的任何位置调用它们。如果有一天你需要更改API调用,因为后端发生了变化,你必须在一个地方(在服务文件中)而不是在你使用它的每个控制器中更改它
答案 1 :(得分:1)
理想情况下,在控制器中使用$http
不是一个好主意。
任何业务逻辑都应该在factories / services
中实现。
以下是我在我的项目中使用它一段时间的实现。
向RESTFul API
(function () {
angular.module('myApp').factory('serviceFactory', function ($http) {
var obj = {};
var serviceUrl = "HOST URL/";
// common service call
obj.serviceCall = function (URL, method, reqParam) {
var reqObject = {
url: serviceUrl + URL,
method: method || 'GET',
data: reqParam,
headers: {
'Content-Type': 'application/json'
}
};
return $http(reqObject)
.then(function success(success) {
return response.data;
}, function err(error) {
alert("There was an error occured. Please try again after some time.");
return false;
});
}
return obj;
});
})();
在控制器中使用
serviceFactory
.serviceCall(CONSTANTS.URL, 'GET', reqParams)
.then(function(data) {
// data is available
});
答案 2 :(得分:0)
完全同意Weedoze你不应该在控制器中放入$ http。所以50个端点,每个1-4个动词都是很多服务器端功能。实际上,您不太可能想要直接从控制器中调节那么多功能。你是对的,如果你为每个端点提供服务,这将是一大堆角度服务。
考虑在可以包含协调功能的服务中对相关功能进行分组。例如,您的用户服务可以管理(并且我制作了一些虚假端点):
用户端点, 登录信息端点
它可能包含一个记录用户的函数,并返回该用户的个人资料(例如)。
答案 3 :(得分:0)
首先,没有"太多的服务"。
您可以做的最好的事情就是远离您的业务逻辑,以及来自控制器的API调用。
如果您开始在控制器中使用$ http服务,那么您最终会在整个洞应用程序中重复使用。
但是,我可以添加的一件事是,如果您在Web服务中遵循REST方法,则可以充分利用 angular-resource (Link)。
此库允许您创建为资源服务提供最常见操作的服务(保存 POST ,删除 DELETE ,查询 GET 集合,获取 GET 单个对象),它也是超级可扩展的。