Создание службы $resource для нескольких вызовов API

Я создал фабричный сервис, который может получать данные из API со следующим кодом.

app.factory('Book', ['$resource','$http', function($resource, $http) {
    return $resource('http://someurl.com/api/book/', {}, {
      query: {method:'GET', isArray:false}
    });
  }]);

Приведенный выше код работает для извлечения данных, но я хотел бы иметь одну службу, которую я могу анализировать, а затем иметь доступ ко всем различным вызовам API. Ниже приведен теоретический способ его создания с помощью службы $http, но я не могу заставить его работать. И я также хотел бы иметь функциональность $resource. Я надеялся, что кто-нибудь подскажет мне синтаксис, как я могу отделить каждый «вызов» $resource от функции, прикрепленной к службе? Как это сделано с сервисом $http ниже.

app.service('dataService', ['$resource','$http', function($resource, $http) {    
    var urlBase = 'http://someurl.com/api/';

    this.getBooks = function () {
        return $http.get(urlBase + 'book')
    };

    this.getArticles = function () {
        return $http.get(urlBase + 'articles');
    };
}]);

person Nicklas Kevin Frank    schedule 24.07.2014    source источник
comment
А нельзя вместо $http.get(urlBase + 'book') поставить $resource(urlBase + 'book').get();   -  person Gustav    schedule 24.07.2014


Ответы (2)


Отредактировано, чтобы отразить ваши потребности. Хотя запускать не пробовал.

app.factory('DataService', ['$resource',
    function($resource) {
        return $resource('http://someurl.com/api/:path', {
            path: '@path'
        }, {
            getBook: {
                method: 'GET',
                params: {
                    path: 'book'
                }
            }
        }, {
            getArticles: {
                method: 'GET',
                params: {
                    path: 'articles'
                },
                isArray: true
            }
        });
    }
])

Затем в вашем контроллере просто вызовите службу ресурсов с правильным путем:

this.getBook = function() {
    $scope.book = DataService.getBook({}, function success() {
        //your code
    }, function err() {
        //your code
    });
};

this.getArticles = function() {
    $scope.articles = DataService.getArticles({}, function success() {
        //your code
    }, function err() {
        //your code
    });
};
person Goodzilla    schedule 24.07.2014
comment
Почти, я надеялся, что логика будет наоборот - чтобы мои пути были определены в службе, позволяющей мне вызывать DataService.getBooks(); или DataService.getArticles(); в контроллере. - person Nicklas Kevin Frank; 24.07.2014
comment
Как мы можем передать разное количество параметров одному и тому же URL-адресу ресурса, возможно ли это вообще? - person neelmeg; 30.11.2016

Приведенное выше решение Goodzilla сработало, но в итоге я использовал решение Густав

app.service('dataService', ['$resource', function($resource) {
    var urlBase = 'http://someurl.com/api/';

    this.getBooks = function () {
        return $resource(urlBase + 'Books').get();
    };

    this.getArticles = function () {
        return $resource(urlBase + 'Articles').get();
    };

}]);

И контроллер

app.controller('MyCtrl', ['$scope', 'dataService', function($scope, DataService) {
    $scope.logBook = DataService.getBooks();
}]);
person Nicklas Kevin Frank    schedule 24.07.2014