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