AngularJS - Должны ли мы обернуть методы http в службе

Мой вопрос в том, что учитывая силу перехватчиков, имеет смысл обернуть $http в службу, чтобы весь мой другой код просто вызывал эту оболочку. Теперь основные задачи, такие как обработка заголовков и исключений, могут быть легко выполнены перехватчиками. Так что, хотя я не могу сейчас думать о действительной usecase, но позволяет просто защитить любые будущие изменения api и т.д. До $http? Или, может быть, позже перейдите на $resource?

Также обратите внимание, что здесь я говорю об основной службе обертки вокруг методов $http s, а не о клиентской службе, такой как DataService, с методами sendData, receiveData, которая обертывает вызовы $http. Ниже приведен пример кода -

angular.module(‘myapp’).factory(‘myhttpwrapper’, ['$http', function (http) {
  return {

    myGet: function (getUrl) {
      return http.get(getUrl);
    },
    myPost: function (postUrl, data) {
      return http.post(postUrl, data);
    },
    // other $http wrappers
  };
}]);

Теперь все остальные коды будут использовать методы myhttpwrappers myGet, myPost вместо $http s get, post methods. Надеюсь, это имеет смысл!

[EDIT]. В каких случаях мы обязательно будем перехватывать запросы на добавление заголовков, протоколирование и ответы для ведения журнала, обработку исключений и т.д. Но я уверен, что они могут обрабатываться перехватчиками. Позже переход от $http до $resource неизвестен на данный момент.

Спасибо.

Ответ 1

В конкретном случае, который вы описываете, я бы посоветовал обернуть $http. Нет никакого реального выигрыша в этом.

Случай, когда это может вступить в игру, будет тем, где вам нужен более "говорящий" API. Допустим, что у вас есть User (s) в системе и Address (es). Вы описали его как службу на основе данных DataService:

var app = angular.module("users", []);

app.service("User", ['$http', '$q', function(http, q) {
  return {
    getAddress: function(user) {
      var address = q.defer();
      http.get("/user/" + user.id + "/address").then(function(data) {
        address.resolve(data);
      }, function(err) {
        address.reject(err);
      });
      return address.promise;
    },
    getUser: function() {
      var user = = q.defer();
      http.get("/user/address").then(function(data) {
        user.resolve(data);
      }, function(err) {
        user.reject(err);
      });
      return user.promise;
    }
  }
}]);

Это позволяет использовать параметры для вашего вызова. Всякий раз, когда вам придется менять маршруты, у вас будет только одно место для их изменения (это было бы очень ужасно, если бы, скажем, у вас было дюжина контроллеров, делающих запросы $http).

Здесь вы также можете использовать $resource, если вы (и на самом деле имеете совместимые ресурсы). Фактор принятия решения здесь должен быть удобочитаемости, повторного использования и легкость изменения позже.

Итак, если вы только когда-нибудь находитесь на месте, где вы совершаете эти звонки, и маршруты никогда не меняются, продолжайте использовать и $http напрямую, без обертки. Это я считаю маловероятным в растущем приложении.

Ответ 2

Мне нужно, чтобы мой 'get' был обобщен, поэтому он выглядел так:

app.factory('myHttp', ['$http', '$q', function($http, $q) {
return {
    get: function(url) {
        var deferred =  $q.defer();
        $http.get(url).then(
            function(response) {
                //console.log("response good");
                deferred.resolve(response)
            },
            function(response) {
                //console.log("response bad");
                deferred.reject(response)
            })
        return deferred.promise;
    }
};
}]);

Теперь вы можете связать дополнительный "затем" с результатом get. У вас может быть основная логика для обработки ошибок или успехов (мой вариант использования заключается в том, чтобы вывести пользователя из системы, если учетные данные истекли), но по-прежнему допускает дополнительную специфическую для контекста логику для ответа на запрос (например, параметр $scope и т.д.).