AngularJS $ http и $ resource

239

Недавно я был выставлен AngularJS, поэтому, пожалуйста, простите мое невежество.

У меня есть некоторые веб-службы, которые я хочу вызвать. $resource или $http, который я должен использовать?

$resource: https://docs.angularjs.org/api/ngResource/service/$resource

$http: https://docs.angularjs.org/api/ng/service/$http

После того, как я прочитал две вышеперечисленные страницы API, я потерялся.

Не могли бы вы объяснить мне на простом английском языке, в чем разница и в какой ситуации я должен их использовать? Как структурировать эти вызовы и правильно прочитать результаты в js-объектах?

  • 25
    $ resource построен поверх $ http и обеспечивает дальнейшее абстрагирование от базовых коммуникаций. Требуется также конечная точка REST, соответствующая шаблонам $ resource. Поскольку вы спрашиваете, я предлагаю начать с $ http, познакомиться, а затем посмотреть, сможете ли вы перейти на $ resource.
  • 4
    Спасибо за ответ. Итак, в какой ситуации $ http когда-либо предпочтительнее $ ресурса, кроме того, что я могу познакомиться с API?
Теги:
web-services

9 ответов

149
Лучший ответ

$http для общего назначения AJAX. В большинстве случаев это то, что вы будете использовать. С $http вы собираетесь создавать GET, POST, DELETE типы вызовов вручную и обрабатывать объекты, которые они возвращают самостоятельно.

$resource wraps $http для использования в сценариях веб-API RESTful.


Говоря ОЧЕНЬ вообще: веб-служба RESTful будет сервисом с одной конечной точкой для типа данных, которая делает разные вещи с этим типом данных на основе HTTP-методов, таких как GET, POST, PUT, DELETE и т.д. Таким образом, с помощью $resource вы можете вызвать GET, чтобы получить ресурс как объект JavaScript, затем изменить его и отправить обратно с помощью POST или даже удалить его с помощью DELETE.

... если это имеет смысл.

  • 0
    Таким образом, $ resource обрабатывает Restful-сервисы, что означает, что его также можно использовать для вызова обычных веб-сервисов? Так как это делает ПОЛУЧИТЬ ПОСТАВИТЬ УДАЛИТЬ PUT все это. Итак, в какой ситуации $ http всегда предпочтительнее $ ресурса?
  • 7
    На самом деле, когда вы не имеете дело с по-настоящему спокойной конечной точкой. Он добавляет множество функциональных возможностей, которые вам не понадобятся, например, если ваша конечная точка разрешает только GET.
Показать ещё 3 комментария
203

Я чувствую, что другие ответы, хотя и правильные, не совсем объясняют корень вопроса: REST является подмножеством HTTP. Это означает, что все, что можно сделать с помощью REST, можно выполнить с помощью HTTP, но не все, что можно сделать с помощью HTTP, можно выполнить с помощью REST. Вот почему $resource использует $http внутренне.

Итак, когда использовать друг друга?

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

Если вместо этого вы пытаетесь получить доступ к НИЧЕГО, не являющемуся RESTful webservice, вам придется идти с $http. Имейте в виду, что вы также можете получить доступ к веб-сервису RESTful через $http, это будет намного более громоздким, чем с $resource. Так большинство людей делают это за пределами AngularJS, используя jQuery.ajax (эквивалент Angular $http).

  • 21
    хороший ответ, это должно быть принято, а не тот сверху
  • 2
    Это означает, что у нас есть три способа вызвать RESTful ?? Используя $ resource, $ http и jquery.ajax, я прав?
Показать ещё 3 комментария
34

$http делает вызов AJAX общего назначения, в котором общий означает, что он может включать RESTful api plus Non-RESTful api.

и $resource специализирован для этой части RESTful.

Restful Api появился в последние годы, потому что URL-адрес лучше организован вместо случайного URL-адреса, составленного программистами.

Если я использую API RESTful для создания URL-адреса, это будет что-то вроде /api/cars/:carId.

$resource способ получения данных

angular.module('myApp', ['ngResource'])

    // Service
    .factory('FooService', ['$resource', function($resource) {
        return $resource('/api/cars/:carId')
    }]);

    // Controller
    .controller('MainController', ['FooService', function(FooService){
        var self = this;
        self.cars = FooService.query();
        self.myCar = FooService.get('123');

    }]);

Это даст вам объект ресурса , который автоматически сопровождается методами get, save, query, remove, delete.

$http способ получения данных

angular.module('myApp', [])

    // Service
    .factory('FooService', ['$http', function($http){
        return {
            query: function(){
                return $http.get('/api/cars');
            },

            get: function(){
                return $http.get('/api/cars/123');
            }
            // etc...
        }

Посмотрите, как нам нужно определить каждую общую операцию в RESTFul API. Также одно отличие состоит в том, что $http возвращает promise, а $resource возвращает объект. Существуют также сторонние плагины, которые помогают Angular работать с API RESTFul, например restangular


Если API-код похож на /api/getcarsinfo. Все остальное для нас - использовать $http.

  • 4
    Это должен быть ответ.
  • 1
    Если api /api/getcarsinfo я думаю, что мы все еще можем использовать $resource
Показать ещё 3 комментария
23

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

Это был мой опыт: я начал свой первый проект Angular, мне нужно было сделать HTTP-запросы для интерфейса RESTful, поэтому я сделал то же самое исследование, которое вы сейчас делаете. Основываясь на обсуждении, я прочитал в таких вопросах, как этот, я решил пойти с $resource. Это была ошибка, которую я хотел бы отменить. Вот почему:

  • $http примеры многочисленны, полезны и вообще то, что вам нужно. Явные $resource примеры недостаточны, и (по моему опыту) редко все, что вам нужно. Для новичков Angular вы не поймете последствий своего выбора до тех пор, пока не столкнетесь с недоумением над документацией и не разозлитесь, что не можете найти полезные примеры $resource, чтобы помочь вам.
  • $http, вероятно, является ментальной картой 1 к 1, которую вы ищете. Вам не нужно изучать новую концепцию, чтобы понять, что вы получаете с помощью $http. $resource приносит много нюансов, что у вас еще нет ментальной карты.
  • К сожалению, я сказал, что вам не нужно изучать новую концепцию? В качестве Angular новичка вы do должны узнать о promises. $http возвращает обещание и возможно .then, поэтому он вписывается в новые вещи, которые вы узнаете о Angular и promises. $resource, который не возвращает обещание напрямую, усложняет ваше предварительное понимание основ Angular.
  • $resource является мощным, поскольку он конденсирует код для вызовов RESTful CRUD и преобразований для ввода и вывода. Это здорово, если вам надоело многократно писать код для обработки результатов $http самостоятельно. Для кого-либо еще $resource добавляет критический слой синтаксиса и передачи параметров, который запутывает.

Жаль, что я знал меня 3 месяца назад, и я бы решительно сказал себе: "Придерживайтесь ребенка $http. Это просто отлично".

  • 1
    Мне нравится ваш ответ, особенно последняя строка. В настоящее время я переживаю изменения в использовании $ resource против $ http. Еще я бы добавил, что $ resource действительно очень удобен и помогает, когда вы используете одно и то же существительное API, например /user/:userId или /thing . Когда вы перейдете в /users/roles/:roleId вам /users/roles/:roleId изменять URL-адрес $ $ params и params для каждого глагола, и в этот момент вы также можете использовать $ http.
  • 3
    Называйте меня шизофреником, чтобы комментировать мой собственный ответ, но я подумал, что упомяну более недавний опыт. Я проводил рефакторинг для устранения $resource и переключения на $http местами. Я не могу особо подчеркнуть, сколько бы мне хотелось, чтобы я никогда не встречал $resource . Я, вероятно, потратил впустую больше недели, отыскивая нюансы $resource за месяцы. $http настолько прост и понятен, что любой выигрыш в $resource был полностью уничтожен кривой обучения.
20

Думаю, важно подчеркнуть, что $resource ожидает объект или массив как ответ от сервера, а не сырой строки. Поэтому, если в качестве ответа вы используете необработанную строку (или все, кроме объекта и массива), вам нужно использовать $http

  • 0
    Означает ли это, что $ http не поддерживает объект и массив? Просто хотел уточнить.
  • 0
    Я считаю, что $ http поддерживает объекты, массивы и строки - мне нужно подтверждение, хотя
Показать ещё 2 комментария
7

Когда дело доходит до выбора между $http или $resource технически говоря, нет правильного или неправильного ответа, в сущности, оба будут делать то же самое.

Цель $resource - позволить вам передать строку шаблона (строку, содержащую заполнители) вместе с значениями параметров. $resource заменит заполнители строки шаблона значениями параметров, передаваемыми как объект. Это в основном полезно при взаимодействии с источником данных RESTFul, поскольку они используют аналогичные принципы для определения URL-адресов.

Что $http делает, это выполнить асинхронные запросы HTTP.

  • 1
    Это хороший ответ, потому что он указывает, что $ http - это то, что обеспечивает запросы от $ resource, и которые либо делают, по сути, то же самое.
  • 0
    @Dalorzo То есть вы хотите сказать, что $resource не может работать асинхронно? Просто хотел уточнить
Показать ещё 1 комментарий
2

Одна вещь, которую я заметил при использовании $resource over $http, - это если вы используете веб-API в .net

Ресурс

$привязан к одному контроллеру, который выполняет одну цель.

$resource ('/user/: userId', {userId: '@id'});

[HttpGet]
public bool Get(int id)
{
    return "value"
}

public void Post([FromBody]string value)
{
}

public void Put(int id, [FromBody]string value)
{
}

public void Delete(int id)
{
}

В то время как $http может быть что угодно. просто укажите URL.

$http.get - "api/authenticate"

[HttpGet]
public bool Authenticate(string email, string password)
{
    return _authenticationService.LogIn(email, password, false);
}

Это просто мое мнение.

2
Служба ресурсов

- это просто полезный сервис для работы с REST APSI. когда вы его используете, вы не пишете свои методы CRUD (создайте, прочитайте, обновите и удалите)

Насколько я вижу, служба ресурсов - это просто ярлык, вы можете делать все с помощью http service.

  • 0
    Я не уверен, что классифицировал бы $ resource как ярлык. Это оболочка для $ http, поэтому использование $ http напрямую будет «короче». Это способ настроить $ http таким образом, чтобы у вас было потенциально меньше кода при использовании $ http. В одном случае $http.get('/path/to/thing', params) против myResource.get(params) плюс фактическая настройка myResource . Больше кода заранее и только действительно работает плавно с тем же существительным API. В противном случае вы кодируете столько же, сколько используете $ http.
0

Служба $resource в настоящее время не поддерживает promises и поэтому имеет совершенно другой интерфейс к службе $http.

  • 1
    Служба $ resource поддерживает обещания, но не возвращает $ обещание напрямую, как $ http. Вы должны сделать это как var myResource = $resource(...config...); затем в другом месте службы вы return myResource.get(..params...) или можете сделать это var save = myResource.save(); save.$promise.then(...fn...); return save;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню