AngularJS $ http і $ ресурс


257

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

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

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

Після того, як я прочитав дві вищезгадані сторінки API, я втратив.

Чи можете ви, будь ласка, пояснити мені простою англійською мовою, в чому різниця і в якій ситуації я повинен їх використовувати? Як я структурую ці виклики і правильно зчитую результати в об'єктах js?


25
$ ресурс побудований на версії $ http і забезпечує подальше абстрагування від базових комунікацій. Він також вимагає кінцевої точки REST, яка відповідає моделям ресурсів $. Оскільки ви запитуєте, моя пропозиція - почати з $ http, ознайомитись, а потім пізніше подивитися, чи можете ви перейти на $ ресурс.
David Riccitelli

4
Дякую за відповідь. Отже, в якій ситуації $ http коли-небудь надає перевагу більше $ ресурсу, крім того, що я можу познайомитись з api?
Том

Відповіді:


168

$httpє загальним призначенням AJAX. У більшості випадків саме цим ви користуєтесь. З $httpви збираєтеся робити GET, POST, DELETEтип дзвінків вручну і обробки об'єктів , вони повертаються на свої власні.

$resourceобгортання $httpдля використання в сценаріях RESTful web API.


Якщо говорити в найзагальнішому вигляді : веб - сервіс заспокійливої буде обслуговування з однієї кінцевої точки для типу даних , який робить різні речі з цим типом даних на основі HTTP методи , такі як GET, POST, PUT, DELETEі т.д. Таким чином , з $resource, ви можете назвати , GETщоб отримати ресурс як об’єкт JavaScript, а потім змініть його та відправте назад із символом "А" POSTабо навіть видаліть його DELETE.

... якщо це має сенс


1
Так $ ресурс обробляє Відпочиваючі сервіси, це означає, що його також можна використовувати для виклику звичайних веб-сервісів? Оскільки це ВИДАЄТЬСЯ ПОСЛУХУВАТИ ВІДКРИТИ все це. Отже, в якій ситуації $ http коли-небудь надає перевагу над $ ресурсом?
Том

7
Дійсно в будь-який час ви не маєте справу з справді спокійною кінцевою точкою. Це додає багато функціоналу, який би вам не знадобився, якщо, наприклад, ваша кінцева точка дозволила отримати лише GET.
Бен Леш

@blesh, тому використання $resourceсервісу буде тільки ідіоматичними / добре , якщо ваша REST кінцевої точка опори GET, POST, і DELETE ? Документи ( docs.angularjs.org/api/ngResource.$resource ) показують, що ви отримуєте ці 3 методи REST $resource.
Кевін Мередіт

9
@KevinMeredith: Або це будь-яка кількість методу. Ви можете додати PUTабо будь-що інше, що хочете GET, POSTі DELETEє лише за замовчуванням. Якщо у вас є кінцева точка, яка займається одним і тим же ресурсом (що важливо) для більш ніж одного методу HTTP, то $resourceце хороший вибір.
Бен Леш

Навіть для кінцевої точки, яка не є RESTful, мені було зручно використовувати $ ресурс для даних типу GET і QUERY. З огляду на те, як .$promiseдобре працює resolveмаршрутизація та прив'язка.
Кевін

210

Я вважаю, що інші відповіді, хоча і правильні, не зовсім пояснюють корінь питання: RESTце підмножина HTTP. Це означає, що все, що можна зробити через, RESTможна зробити через, HTTPале не все, що можна зробити через, HTTPможна зробити через REST. Саме тому $resourceвикористовує $httpвнутрішньо.

Отже, коли користуватися один одним?

Якщо все, що вам потрібно, це те REST, що ви намагаєтеся отримати доступ до веб- RESTfulсервісу, $resourceце спростить взаємодію з цією веб-службою дуже просто.

Якщо замість цього ви намагаєтесь отримати доступ до будь-якого, що не є веб-сервісом RESTful, вам доведеться піти з цим $http. Майте на увазі, ви також можете отримати доступ до веб- RESTfulсервісу через $http, це буде просто набагато громіздкіше, ніж з $resource. Це так, як більшість людей робили це за межами AngularJS, використовуючи jQuery.ajax(еквівалент Angular's $http).


21
приємна відповідь, це слід прийняти, а не той зверху
Анджей Реманн

2
Це означає, що у нас є три способи викликати RESTful ?? Використовуючи $ resource, $ http та jquery.ajax, я прав?
Джейк Хуанг

4
@JakeHuang Ви можете назвати це навіть без будь-якої бібліотеки, існує нескінченний спосіб зробити це. Я щойно викрив 2 найпопулярніші підходи у світі AngularJS та найпоширеніший підхід поза ним.
bluehallu

Чи можу я знати, які два найпопулярніші підходи в AngularJS? : p
Джейк Хуанг

41

$httpробить виклик AJAX загального призначення, в якому загальні засоби можуть включати RESTful api плюс не-RESTful api.

і $resourceспеціалізується на цій ВІДПОВІДНІЙ частині.

Спокійний Апі в останні роки переважає, оскільки 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...
        }

Подивіться, як нам потрібно визначити кожну спільну операцію в API RESTFul . Також одна відмінність полягає в тому, що $httpповертає promiseпри $resourceповерненні об'єкт. Існують також сторонні плагіни, які допомагають Angular розбиратися з API RESTFul, як-от перезапуск


Якщо API щось подібне /api/getcarsinfo. Залишилося нам скористатися $http.


4
Це має бути відповідь.
Рой Намір

1
Якщо api є, /api/getcarsinfoя думаю, ми все ще можемо використовувати$resource
kittu

1
Це має бути відповідь. коли ви сказали "Крім того, одна різниця полягає в тому, що $ http повертає обіцянку, а $ ресурс повертає об'єкт" 1 - чи це означає, що мені не потрібно використовувати. 2- також, як особа, яка перебуває на фронті, і це може звучати нерозумно, як я можу дізнатися, чи api спокійний чи ні? спасибі
shireef khatab

1
@shireefkhatab 1. так, $ ресурс - це лише абстракція $ http для вищого рівня для підтримання API RESTFul. Приклад doc показує, як його використовувати. 2. Це повністю залежить від того, як ваш хлопець створить URL-адресу. Якщо він хоче відповідати парадигмі RESTFul api, тоді вам добре піти
Цянь

30

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

Це був мій досвід: я розпочав свій перший проект Angular, мені потрібно було зробити запити HTTP до інтерфейсу RESTful, тому я зробив те саме дослідження, що ви робите зараз. На основі обговорення, який я читав у таких питаннях, як цей, я вирішив піти $resource. Це була помилка, яку я хотів би скасувати. Ось чому:

  1. $httpприкладів безліч, корисних і загалом лише те, що вам потрібно. Ясних $resourceприкладів мало, і (на мій досвід) рідко все, що потрібно. Що стосується кутового новачка, ви не зрозумієте наслідків свого вибору до пізніше, коли ви будете спантеличені документацією і злитесь, що не можете знайти корисних $resourceприкладів, які допоможуть вам допомогти.
  2. $httpце, мабуть, ментальна карта «1 на 1» для того, що ви шукаєте. Вам не доведеться вивчати нову концепцію, щоб зрозуміти, що ви отримуєте $http. $resourceприносить багато нюансів, про які ви ще не маєте ментальної карти.
  3. На жаль, я сказав, що вам не доведеться вивчати нову концепцію? В якості кутового новачка ви дійсно повинні дізнатися про обіцянки. $httpповертає обіцянку та .thenзможе, тож вона відповідає всім новим речам, про які ви дізнаєтесь про Angular, та обіцянках. $resource, що не повертає обіцянки безпосередньо, ускладнює ваше попереднє розуміння кутових основ.
  4. $resourceє потужним, оскільки конденсує код для RESTful викликів CRUD та перетворень для введення та виводу. Це чудово, якщо вам не вистачає багаторазового написання коду для обробки результатів $http. Для всіх інших $resourceдодає криптичний шар синтаксису та передачі параметрів, що заплутано.

Мені б хотілося, щоб я знав мене 3 місяці тому, і я б наголошував собі: "Дотримуйтесь $httpдитину. Це просто добре".


1
Мені подобається ваша відповідь, особливо останній рядок. В даний час я переживаю зміну використання $ resource vs $ http. Я також хочу додати, що ресурс $ дійсно корисний лише та допомагає, коли ви використовуєте той самий іменник API , як /user/:userIdабо /thing. Як тільки ви переходите до /users/roles/:roleIdцього пункту, вам доведеться змінювати URL-адресу та параметри $ ресурс на основі дієслова, і ви можете також використовувати $ http у цьому пункті.
coblr

3
Зателефонуйте мені шизофреніком, щоб прокоментувати власну відповідь, але я подумав згадати новіший досвід. Я займався рефакторингом для усунення $resourceта переходу на $httpмісця. Я не можу наголосити достатньо, наскільки я хочу побажати, щоб я ніколи не зустрічався $resource. Я, мабуть, витратив більше тижня, переслідуючи нюанси $resourceпротягом місяців. $httpНастільки легко і просто, що будь-який прибуток, який мав бути, $resourceбув ретельно знищений кривою навчання.
Матвій Марічіба

24

Я думаю, що важливо підкреслити, що $ ресурс очікує об'єкт або масив як відповідь від сервера, а не необроблений рядок. Отже, якщо у вас є відповідна рядок (або що-небудь крім об'єкта та масиву) як відповідь, вам доведеться використовувати $ http


Чи означає це, що $ http не підтримує об'єкт і масив? Просто хотів уточнити.
Шардул

Я вважаю, що $ http підтримує об'єкти, масиви та рядки - мені це потрібно підтвердження
Katana24

@Shardul, я розумів, що $ http має справу з будь-яким видом відповіді, але $ ресурс стосується лише об'єктів та масивів.
ширіф-хатаб

Неправда, ви все одно можете використовувати $ ресурс для повернення рядка. Використовуйте "transformResponse" у своєму коді фронтенда, щоб обернути повернуту рядок в об'єкт.
Террі Ден

7

Що стосується вибору $httpабо $resourceтехнічно кажучи, то немає правильної чи неправильної відповіді, по суті обидва зроблять те ж саме.

Мета $resource- дозволити вам передати рядок шаблону (рядок, що містить заповнювачі) разом зі значеннями параметрів. $resourceзамінить заповнювачі заповнення рядка шаблону значеннями параметрів, переданими як об'єкт. Це в основному корисно при взаємодії з джерелом даних RESTFul, оскільки вони використовують подібні принципи для визначення URL-адрес.

Що $httpпотрібно для виконання асинхронних запитів HTTP.


1
Це хороша відповідь, оскільки він вказує, що $ http - це те, що надає повноваження запитам з $ ресурсу, і що або по суті роблять те саме.
coblr

@Dalorzo Отже, ви хочете сказати, що $resourceне може виконувати асинхронно? Просто хотів уточнити
kittu

Ні, я зазначив, що в кінцевому підсумку $httpце найпростіший спосіб виконання асинхронних запитів HTTP, і $resourceпо суті, те саме, але з різними параметрами
Dalorzo

2

Служба ресурсів - просто корисна послуга для роботи з REST APSI. при його використанні ви не записуєте свої методи CRUD (створюйте, читайте, оновлюйте та видаляйте)

Наскільки я бачу, сервіс ресурсів - це лише ярлик, з сервісом http ви можете робити все що завгодно.


Я не впевнений, що я класифікував би ресурс як ярлик. Це обгортка для $ http, тому використання $ http безпосередньо було б "коротшим". Це спосіб налаштувати $ http, щоб у вас було потенційно менше коду при використанні $ http. В одному випадку $http.get('/path/to/thing', params)проти myResource.get(params)плюс фактично робимо конфігурацію для myResource. Більше коду на передній частині і працює лише плавно з тим самим іменником API. В іншому випадку ви кодуєте так само, як якщо б ви використовували $ http.
coblr

2

Одне, що я помітив під час використання ресурсу $ понад $ http, - це якщо ви використовуєте Web 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 / автентифікація"

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

це лише моя думка.


0

Служба ресурсів $ на даний момент не підтримує обіцянок і тому має чітко інший інтерфейс до служби $ http.


1
Служба ресурсів $ підтримує обіцянки, але не повертає $ обіцянку безпосередньо, як це робить $ http. Ви повинні робити це так, як var myResource = $resource(...config...);потім десь у службі, яку ви робите, return myResource.get(..params...)або можете робитиvar save = myResource.save(); save.$promise.then(...fn...); return save;
coblr
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.