AngularJS $http и $resource
Недавно я был выставлен AngularJS, поэтому, пожалуйста, простите мое невежество.
У меня есть некоторые веб-службы, которые я хочу вызвать. $resource
или $http
, который я должен использовать?
$resource
: https://docs.angularjs.org/api/ngResource/service/$resource
$http
: https://docs.angularjs.org/api/ng/service/$http
После того, как я прочитал две вышеперечисленные страницы API, я потерялся.
Не могли бы вы объяснить мне на простом английском языке, в чем разница и в какой ситуации я должен их использовать? Как структурировать эти вызовы и правильно прочитать результаты в js-объектах?
Ответы
Ответ 1
$http
для общего назначения AJAX. В большинстве случаев это то, что вы будете использовать. С $http
вы собираетесь создавать GET
, POST
, DELETE
типы вызовов вручную и обрабатывать объекты, которые они возвращают самостоятельно.
$resource
wraps $http
для использования в сценариях веб-API RESTful.
Говоря ОЧЕНЬ вообще: веб-служба RESTful будет сервисом с одной конечной точкой для типа данных, которая делает разные вещи с этим типом данных на основе HTTP-методов, таких как GET
, POST
, PUT
, DELETE
и т.д. Таким образом, с помощью $resource
вы можете вызвать GET
, чтобы получить ресурс как объект JavaScript, затем изменить его и отправить обратно с помощью POST
или даже удалить его с помощью DELETE
.
... если это имеет смысл.
Ответ 2
Я чувствую, что другие ответы, хотя и правильные, не совсем объясняют корень вопроса: REST
является подмножеством HTTP
. Это означает, что все, что можно сделать с помощью REST
, можно выполнить с помощью HTTP
, но не все, что можно сделать с помощью HTTP
, можно выполнить с помощью REST
. Вот почему $resource
использует $http
внутренне.
Итак, когда использовать друг друга?
Если вам нужно всего лишь REST
, то есть вы пытаетесь получить доступ к веб-сервису RESTful
, $resource
будет очень легко взаимодействовать с этим веб-сервисом.
Если вместо этого вы пытаетесь получить доступ к НИЧЕГО, не являющемуся RESTful
webservice, вам придется идти с $http
. Имейте в виду, что вы также можете получить доступ к веб-сервису RESTful
через $http
, это будет намного более громоздким, чем с $resource
. Так большинство людей делают это за пределами AngularJS, используя jQuery.ajax
(эквивалент Angular $http
).
Ответ 3
$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
Я думаю, что ответ больше зависит от того, кто вы на момент написания кода. Используйте $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
. Это просто отлично".
Ответ 5
Думаю, важно подчеркнуть, что $resource ожидает объект или массив как ответ от сервера, а не сырой строки. Поэтому, если в качестве ответа вы используете необработанную строку (или все, кроме объекта и массива), вам нужно использовать $http
Ответ 6
Когда дело доходит до выбора между $http
или $resource
технически говоря, нет правильного или неправильного ответа, в сущности, оба будут делать то же самое.
Цель $resource
- позволить вам передать строку шаблона (строку, содержащую заполнители) вместе с значениями параметров. $resource
заменит заполнители строки шаблона значениями параметров, передаваемыми как объект. Это в основном полезно при взаимодействии с источником данных RESTFul, поскольку они используют аналогичные принципы для определения URL-адресов.
Что $http
делает, это выполнить асинхронные запросы HTTP.
Ответ 7
Служба ресурсов - это просто полезный сервис для работы с REST APSI.
когда вы его используете, вы не пишете свои методы CRUD (создайте, прочитайте, обновите и удалите)
Насколько я вижу, служба ресурсов - это просто ярлык,
вы можете делать все с помощью http service.
Ответ 8
Одна вещь, которую я заметил при использовании $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);
}
Это просто мое мнение.
Ответ 9
Служба $resource в настоящее время не поддерживает promises и поэтому имеет совершенно другой интерфейс к службе $http.