为AngularJS项目组织API服务

时间:2017-03-03 06:59:45

标签: angularjs rest

我们的项目有大约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服务。

你认为这种方式更好吗? 提前谢谢。

4 个答案:

答案 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 单个对象),它也是超级可扩展的。