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.