AngularJS $ http服务 - 复合URI的最佳实践

时间:2017-06-28 21:57:44

标签: angularjs rest http uri

我需要为我的"客户用户"创建一项服务。我的API端点使用/api/v1/customer/:id_customer/users方法GET/POST/PUT/DELETE

现在,在我的AngularJS代码中,我有一个服务,它是我的AngularJS controllers$http服务之间的接口,如下所示:

module.exports = function ($http) {
    var service = {};
    var _mainUrl = 'http://localhost:8080/api/v1/customer/';

    service.get = function (id) {
        return $http({
            method: 'GET',
            url: _mainUrl + id
        });
    };

    service.save = function (model) {
        return $http({
            method: 'POST',
            url: _mainUrl,
            data: model
        });
    };

    return service;
};

现在,在我的"客户用户"服务我需要将:id_customer传递给我的服务。那么,这将是一个很好的方法?我应该将:id_customer传递给每个方法,例如:

module.exports = function ($http) {
    var service = {};
    var _mainUrl = 'http://localhost:8080/api/v1/customer/';
    var _tailUrl = '/user/';

    service.get = function (id_customer, id) {
        return $http({
            method: 'GET',
            url: _mainUrl + id_customer + _tailUrl + id
        });
    };

    return service;
};

或者我应该有一个"setter"并在拨打任何电话之前拨打电话,例如:

module.exports = function ($http) {
    var service = {};
    var _mainUrl = 'http://localhost:8080/api/v1/customer/';
    var _idCustomer = '';
    var _tailUrl = '/user/';

    service.get = function (id) {
        return $http({
            method: 'GET',
            url: _mainUrl + _idCustomer + _tailUrl + id
        });
    };

    service.setCustomer = function (id_customer) {
        _idCustomer = id_customer;
    }

    return service;
};

1 个答案:

答案 0 :(得分:1)

第一种方法更好 - 将id_customerid_user传递给一种方法。

有几个原因:

  1. 耦合即可。通过“有一个'setter'并在进行任何调用之前调用它”,这个'setter'方法及其相应的'getter'方法非常紧密耦合 - 'getter'方法取决于它的'setter',应该避免。方法应具有高内聚力和低耦合。有关详细信息,请参阅Coupling
  2. 维护问题。由于'setter'应该在'getter'之前调用,因此需要记录此规则,并将其传递给项目中的每个新程序员。然而,人们忘记了事情。即使是经验丰富的开如果程序员调用'getter'但忘记先'设置',则会发生错误。最好通过编码设计来防止错误,而不是通过人员培训来防止错误。
  3. 状态不一致。作为“获取客户”,“获取客户用户”和“设置客户”都在同一服务中,在某些情况下,客户A可能已设置,但稍后在“获取客户”或“调用get-customer-users',返回另一个客户的数据 - 这可以通过严格遵循“任何getter invokation”规则之前的“call setter ”来防止,但同样,此规则取决于开发人员的培训和习惯。