Лучший способ вызвать Rest API из angularjs?

Откуда должен вызываться запрос API REST из angular js?

т.е. от контроллера, модуля, службы, factory. Я совершенно смущен тем, что для этого должен быть правильный путь?

Ответы

Ответ 1

Вы можете использовать ресурсы или создавать службы, реализующие http-вызовы.

Если вы хотите использовать ресурсы, помните:

  • чтобы включить angular -resource.js файл, который вы можете найти здесь
  • включить в объявление вашего модуля, чтобы включить зависимость модуля ngResource следующим образом: angular.module('myApp',['ngResource'])

После этого вы можете объявить ресурс таким образом:

function MyController($scope, $resource){
  var User = $resource('/user/:userId', {userId:'@id'});
  var user = User.get({userId:123}, function() {
    user.abc = true;
    user.$save();
  });
}

Кроме того, используйте службы, если вам нужен гораздо более глубокий уровень детализации, например

angular.module('myApp')
.factory('MyAPIService', function($http){
  var apiurl, myData;
  return {
    getData: function(){
      $http.get(apiurl)
      .success(function(data, status, config, headers){
        myData = data;
      })
      .error(function(){ //handler errors here
      });
    },
    data: function() { return myData; }
  };
});

Я считаю, что услуги отличные из-за возможности обмена данными между контроллерами, поэтому вы можете вводить их в контроллер таким образом

myapp.controller('MyController', function($scope, MyAPIService){
  $scope.data = MyAPIService.data();
  // etc.

});

Ответ 2

Вот что я считаю лучшей практикой:

  • Используйте службу factory для обработки механики доступа к веб-сайту RESTful api
  • Ввести службу factory в контроллер, которому нужен доступ
  • Используйте обещание в factory to разрешить или отклонить ответ от вызова $http
  • Обещание позволяет контроллеру определить, как он должен реагировать на результат вызова RESTful. Например, он может захотеть вызывать всплывающее сообщение тоста, чтобы уведомить пользователя о любой проблеме.

Это поддерживает хорошее разделение между уровнем обслуживания данных, бизнес-логикой и интерфейсом интерфейса. Он также ограничивает любые последствия изменений для любого слоя, для других слоев.

Ответ 3

Вот как мы это делаем: напишите http как метод factory.

Отредактировано в соответствии с комментариями для использования Promise API

 var MyApp = angular.module('App', []);

 MyApp .factory('ApiFactory', ['$http',
        function ($http) {
            return {
               getUsers: function (rowcount) {
                var promise = $http.get('api/Users/' + rowcount) .then(function(response) {
                return response.data;
              }, function (error) {
                //error
            })
            return promise;
           }
         }
       }
   ]);

Теперь вы можете использовать его в controller как это.

MyApp .controller('MyController', ['$scope', 'ApiFactory',
  function ($scope, ApiFactory) {

    $scope.Users = null;

    ApiFactory.getUsers(count).then(function(data)
    {
      $scope.Users = data;
    });
 } 
 ]);

Ответ 4

Вы можете использовать restangular https://github.com/mgonto/restangular

И вы вызовете свой api следующим образом:

// Only stating main route
Restangular.all('accounts')

// Stating main object
Restangular.one('accounts', 1234)

Ответ 5

Пока вы используете службу $http, она действительно не имеет никакого значения.

Хотя существует методология провайдера, в которой говорится, что у вас должен быть поставщик данных на стороне клиента, а также на стороне сервера

Для этого я предлагаю factory, который предоставляет методы, которые вы хотите, и использует сам сервис $http

Ответ 6

Если вы собираетесь использовать этот вызов REST API более чем в одном контроллере, лучше создать службу, которая вводится как зависимость в нужные ей контроллеры. Как уже упоминалось, вы хотите использовать $resource для обработки API RESTful.

index.html

<!-- Include Angular and angular-resources -->
<script src="angular.js"></script>
<script src="angular-resource.js"></script>

<!-- Set up your angular module -->
<div ng-app="RESTfulServiceExample">
    <div ng-controller="HomeController">
        <ul>
            <li ng-repeat="game in games">{{game.GameName}}</li>
        </ul>
    </div>
</div>

<script>
    // Inject angular-resource as ngResource into your module
    var gameListApp = angular.module('RESTfulServiceExample', ['ngResource']);

    // Create a service to call API which can be used by many controllers
    gameListApp.factory('GameService', ['$resource', function($resource) {
        return $resource('/game/:gameId', {gameId: '@id'});
    }]);

    // Create a controller that uses your service
    gameListApp.controller('HomeController', function($scope, GameService) {
        // GET: /game/
        var games = GameService.query();

        // Use response in HTML template
        $scope.games = games;
    });

    // Another controller could use the same service
    gameListApp.controller('GameController', function($scope, GameService) {
        // use GameService for another purpose
    });
</script>

Ссылка: AngularJS: $resource