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, Это была ошибка, которую я хотел бы отменить. Вот почему:

  1. $http примеров много, они полезны и, как правило, именно то, что вам нужно. Очистить $resource примеров мало, и (по моему опыту) редко все, что вам нужно. Для новичка Angular, вы не поймете последствия вашего выбора до тех пор, пока вы застряли, ломая голову над документацией и злитесь, что не можете найти полезного $resource примеры, чтобы помочь вам.
  2. $http это, вероятно, ментальная карта 1 к 1 с тем, что вы ищете. Вам не нужно изучать новую концепцию, чтобы понять, что вы получаете с $http, $resource приносит много нюансов, для которых у вас еще нет ментальной карты.
  3. К сожалению, я сказал, что вам не нужно изучать новую концепцию? Как новичок Angular вы должны узнать об обещаниях. $http возвращает обещание и является .then в состоянии, так что это вписывается в новые вещи, которые вы узнаете об Angular и обещаниях. $resource, который не возвращает обещание напрямую, усложняет ваше предварительное понимание основ Angular.
  4. $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.

Другие вопросы по тегам