AngularJS $ http und $ resource

257

Ich habe einige Webdienste, die ich anrufen möchte. $resourceoder $httpwelches soll ich verwenden?

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

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

Nachdem ich die beiden obigen API-Seiten gelesen habe, bin ich verloren.

Könnten Sie mir bitte im Klartext erklären, was der Unterschied ist und in welcher Situation ich sie verwenden soll? Wie strukturiere ich diese Aufrufe und lese die Ergebnisse korrekt in js-Objekte ein?

Tom
quelle
25
$ resource basiert auf $ http und bietet eine weitere Abstraktion von der zugrunde liegenden Kommunikation. Es erfordert auch einen REST-Endpunkt, der den $ resource-Mustern entspricht. Da Sie fragen, ist mein Vorschlag, mit $ http zu beginnen, sich kennenzulernen und später zu prüfen, ob Sie zu $ ​​resource wechseln können.
David Riccitelli
4
Danke für die Antwort. In welcher Situation wird $ http jemals gegenüber $ resource bevorzugt, abgesehen davon, dass ich die API kennenlernen kann?
Tom

Antworten:

168

$httpist für allgemeine Zwecke AJAX. In den meisten Fällen verwenden Sie dies. Mit $httpIhnen zu machen gehst GET, POST, DELETEruft Typ manuell und Verarbeitung der Objekte , die sie auf eigene Faust zurück.

$resourceWraps $httpzur Verwendung in RESTful-Web-API-Szenarien.


Sprechen Ganz allgemein: Ein RESTful Web - Service ein Service mit einem Endpunkt für einen Datentyp sein , die unterschiedliche Dinge mit diesem Datentyp tut basiert auf HTTP - Methoden wie GET, POST, PUT, DELETE, etc. So mit ein $resource, Sie können einen Anruf auf GETdie Ressource zu erhalten Ändern Sie es dann als JavaScript-Objekt und senden Sie es mit einem zurück POSToder löschen Sie es sogar mit DELETE.

... wenn das Sinn macht.

Ben Lesh
quelle
1
$ Resource behandelt also Restful Services, das heißt, es kann auch zum Aufrufen normaler Webdienste verwendet werden? Da es GET POST DELETE PUT all das tut. In welcher Situation wird $ http jemals gegenüber $ resource bevorzugt?
Tom
7
Wirklich immer dann, wenn Sie es nicht mit einem wirklich erholsamen Endpunkt zu tun haben. Es bietet eine Menge Funktionen, die Sie nicht benötigen würden, wenn Ihr Endpunkt beispielsweise nur GET zulässt.
Ben Lesh
@blesh, so die Verwendung von $resourceService nur idiomatische / gut , wenn Ihre REST - Endpunkt unterstützt würde GET, POST, und DELETE ? Die Dokumente ( docs.angularjs.org/api/ngResource.$resource ) zeigen, dass Sie diese 3 REST-Methoden mit erhalten $resource.
Kevin Meredith
9
@ KevinMeredith: Oder es eine beliebige Anzahl von Methoden. Sie können hinzufügen PUToder alles andere, was Sie möchten GET, POSTund DELETEsind nur Standardeinstellungen. Wenn Sie einen Endpunkt haben, der dieselbe Ressource (das ist wichtig) für mehr als eine HTTP-Methode verarbeitet, $resourceist dies eine gute Wahl.
Ben Lesh
Selbst für einen nicht-RESTful-Endpunkt fand ich es praktisch, $ resource für Daten vom Typ GET und QUERY zu verwenden. Angesichts der Art und Weise .$promisefunktioniert das gut resolvefür Routing und Bindung.
Kevin
210

Ich habe das Gefühl, dass andere Antworten, obwohl sie richtig sind, die Wurzel der Frage nicht ganz erklären: RESTist eine Teilmenge von HTTP. Dies bedeutet, dass alles, was über erledigt werden RESTkann, über erledigt werden kann, HTTPaber nicht alles, was über erledigt werden HTTPkann, über REST. Deshalb $resourcenutzt $httpintern.

Also, wann man sich benutzt?

Wenn RESTSie nur versuchen, auf einen RESTfulWebservice zuzugreifen , $resourcewird die Interaktion mit diesem Webservice sehr einfach.

Wenn Sie stattdessen versuchen, auf ALLES zuzugreifen, was kein RESTfulWebservice ist, müssen Sie mitgehen $http. Denken Sie daran, dass Sie auch über auf einen RESTfulWebservice zugreifen können. Dies $httpist nur viel umständlicher als bei $resource. Dies ist die Art und Weise, wie die meisten Leute es außerhalb von AngularJS gemacht haben, indem sie jQuery.ajax(äquivalent zu Angulars $http) verwendet haben.

Bluehallu
quelle
21
nette Antwort, dies sollte akzeptiert werden, nicht die oben
Andrzej Rehmann
2
Es bedeutet, wir haben drei Möglichkeiten, RESTful zu nennen? Mit $ resource, $ http und jquery.ajax, habe ich recht?
Jake Huang
4
@JakeHuang Sie können es auch ohne Bibliothek aufrufen, es gibt unendlich viele Möglichkeiten, dies zu tun. Ich habe gerade die 2 beliebtesten Ansätze in der AngularJS-Welt und den häufigsten Ansatz außerhalb davon vorgestellt.
Bluehallu
Darf ich wissen, was die 2 beliebtesten Ansätze im AngularJS sind? : p
Jake Huang
41

$httpführt einen Allzweck-AJAX-Aufruf durch, wobei allgemein bedeutet, dass er RESTful- API und Non-RESTful- API enthalten kann.

und $resourceist auf diesen RESTful- Teil spezialisiert.

Restful Api hat sich in den letzten Jahren durchgesetzt, weil die URL besser organisiert ist als die zufällige URL, die von Programmierern erstellt wurde.

Wenn ich eine RESTful-API verwende , um die URL zu erstellen, wäre das ungefähr so /api/cars/:carId.

$resource Weg, um Daten abzurufen

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');

    }]);

Dies wird Ihnen ein Ressourcenobjekt , das mit einhergeht get, save, query, remove, deleteautomatisch Methoden.

$http Weg, um Daten abzurufen

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...
        }

Sehen Sie, wie wir jede allgemeine Operation in der RESTFul-API definieren müssen . Auch ein Unterschied ist , dass die $httpRenditen , promisewährend $resourceein Objekt zurückgegeben. Es gibt auch Drittanbieter - Plug - ins Eckige Deal mit helfen RESTful API wie restangular


Wenn die API so etwas wie ist /api/getcarsinfo. Alles was für uns übrig bleibt ist zu benutzen $http.

Qiang
quelle
4
Dies sollte die Antwort sein.
Royi Namir
1
Wenn die API ist /api/getcarsinfo, können wir sie $resource
wahrscheinlich
1
Dies sollte die Antwort sein. als Sie sagten "Auch ein Unterschied ist, dass $ http ein Versprechen zurückgibt, während $ resource ein Objekt zurückgibt" 1- bedeutet das, dass ich .then nicht mit $ resource verwenden muss? 2- auch als Frontend-Person und das klingt vielleicht albern. Wie kann ich herausfinden, ob die API erholsam ist oder nicht? danke
Shireef Khatab
1
@shireefkhatab 1. Ja, $ resource ist nur eine übergeordnete Abstraktion von $ http für die RESTFul-API-Konnektivität. Das Dokumentbeispiel zeigt, wie es verwendet wird. 2. Es hängt ganz davon ab, wie Ihr Backend-Typ die URL gestaltet. Wenn er sich an das RESTFul-API-Paradigma anpassen möchte, können Sie loslegen
Qiang,
30

Ich denke, die Antwort hängt mehr davon ab, wer Sie zum Zeitpunkt des Schreibens des Codes sind. Verwenden $httpSie diese Option, wenn Sie Angular noch nicht kennen, bis Sie wissen, warum Sie sie benötigen $resource. Bis Sie konkrete Erfahrung haben , wie $httpSie zurückhält, und Sie verstehen die Auswirkungen der Verwendung $resourcein Ihrem Code , Stick mit $http.

Dies war meine Erfahrung: Ich habe mein erstes Angular-Projekt gestartet. Ich musste HTTP-Anforderungen an eine RESTful-Schnittstelle senden, also habe ich die gleichen Untersuchungen durchgeführt, die Sie jetzt durchführen. Aufgrund der Diskussion, die ich in SO-Fragen wie dieser gelesen habe, habe ich mich dafür entschieden $resource. Dies war ein Fehler, den ich gerne rückgängig machen könnte. Hier ist der Grund:

  1. $httpBeispiele sind reichlich vorhanden, hilfreich und im Allgemeinen genau das, was Sie brauchen. Klare $resourceBeispiele sind rar und (meiner Erfahrung nach) selten alles, was Sie brauchen. Für den Angular-Neuling werden Sie die Auswirkungen Ihrer Wahl erst später erkennen, wenn Sie über die Dokumentation rätseln und sich darüber ärgern, dass Sie keine hilfreichen $resourceBeispiele finden, die Ihnen helfen können.
  2. $httpist wahrscheinlich eine 1-zu-1-mentale Karte zu dem, was Sie suchen. Sie müssen kein neues Konzept lernen, um zu verstehen, was Sie damit erreichen $http. $resourcebringt eine Menge Nuancen mit sich, für die Sie noch keine mentale Karte haben.
  3. Hoppla, habe ich gesagt, dass Sie kein neues Konzept lernen müssen? Als Angular Neuling Sie tun müssen , um Versprechungen zu lernen. $httpgibt ein Versprechen zurück und ist in der .thenLage, so dass es genau zu den neuen Dingen passt, die Sie über Angular und Versprechen lernen. $resource, das kein Versprechen direkt zurückgibt, erschwert Ihr vorläufiges Verständnis der Angular-Grundlagen.
  4. $resourceist leistungsstark, da es den Code für RESTful CRUD-Aufrufe und die Transformationen für Eingabe und Ausgabe komprimiert. Das ist großartig, wenn Sie es satt haben, wiederholt Code zu schreiben, um die Ergebnisse Ihrer $httpselbst zu verarbeiten. Fügt jedem anderen $resourceeine verwirrende kryptische Ebene aus Syntax und Parameterübergabe hinzu.

Ich wünschte, ich hätte mich vor 3 Monaten gekannt, und ich würde mir nachdrücklich sagen: "Bleib beim $httpKind. Es ist in Ordnung."

Matthew Marichiba
quelle
1
Ich mag deine Antwort, besonders die letzte Zeile. Ich mache gerade eine Verschiebung in der Verwendung von $ resource vs $ http durch. Die eine Sache, die ich auch hinzufügen möchte, ist, dass $ resource wirklich nur sehr praktisch ist und tatsächlich hilft, wenn Sie dasselbe API- Substantiv wie /user/:userIdoder verwenden /thing. Sobald Sie zu wechseln, müssen /users/roles/:roleIdSie die URL und die Parameter von $ resource pro Verb ändern, und Sie können an diesem Punkt auch $ http verwenden.
Coblr
3
Nennen Sie mich schizophren, weil ich meine eigene Antwort kommentiert habe, aber ich dachte, ich würde neuere Erfahrungen erwähnen. Ich habe umgestaltet, um zu beseitigen $resourceund an einigen $httpStellen zu wechseln . Ich kann nicht genug betonen, wie sehr ich mir wünschte, ich hätte mich nie getroffen $resource. Ich habe wahrscheinlich mehr als eine Woche damit verbracht, die Nuancen der letzten $resourceMonate zu verfolgen. $httpist so einfach und unkompliziert, dass jeder Gewinn $resourcedurch die Lernkurve gründlich ausgelöscht wurde.
Matthew Marichiba
24

Ich denke, es ist wichtig zu betonen, dass $ resource ein Objekt oder Array als Antwort vom Server erwartet, nicht als Rohzeichenfolge. Wenn Sie also eine Rohzeichenfolge (oder etwas anderes als Objekt und Array) als Antwort haben, müssen Sie $ http verwenden

sparrkli
quelle
Bedeutet das, dass $ http Objekt und Array nicht unterstützt? Ich wollte nur klarstellen.
Shardul
Ich glaube, $ http unterstützt Objekte, Arrays und Strings - ich würde allerdings eine Bestätigung brauchen
Katana24
@Shardul, ich habe verstanden, dass $ http sich mit jeder Art von Antwort befasst, aber $ resource nur mit Objekten und Arrays.
Shireef Khatab
Nicht wahr, Sie können trotzdem $ resource für die Rückgabe eines Strings verwenden. Verwenden Sie 'transformResponse' in Ihrem Frontend-Code, um den zurückgegebenen String in ein Objekt zu verpacken.
Terry Deng
7

Wenn es darum geht, zwischen $httpoder $resourcetechnisch gesehen zu wählen, gibt es im Wesentlichen keine richtige oder falsche Antwort. Beide werden das Gleiche tun.

Der Zweck von $resourcebesteht darin, Ihnen die Übergabe einer Vorlagenzeichenfolge (eine Zeichenfolge, die Platzhalter enthält) zusammen mit den Parameterwerten zu ermöglichen. $resourceersetzt die Platzhalter aus der Vorlagenzeichenfolge durch die Parameterwerte, die als Objekt übergeben werden. Dies ist vor allem bei der Interaktion mit der RESTFul-Datenquelle hilfreich, da sie ähnliche Prinzipien zum Definieren der URLs verwenden.

Sie $httpführen die asynchronen HTTP-Anforderungen aus.

Dalorzo
quelle
1
Dies ist eine gute Antwort, da darauf hingewiesen wird, dass $ http die Anforderungen von $ resource antreibt und dass beide im Wesentlichen dasselbe tun.
Coblr
@ Dalorzo Du willst also sagen, dass du $resourcenicht asynchron arbeiten kannst?
Ich
Nein, ich habe darauf hingewiesen, dass es am Ende $httpdie einfachste Möglichkeit ist, asynchrone HTTP-Anforderungen auszuführen, und was im $resourceWesentlichen dasselbe tut, jedoch mit unterschiedlichen Parametern
Dalorzo
2

Der Ressourcenservice ist nur ein nützlicher Service für die Arbeit mit REST-APSIs. Wenn Sie es verwenden, schreiben Sie Ihre CRUD-Methoden nicht (erstellen, lesen, aktualisieren und löschen)

Aus meiner Sicht ist der Ressourcendienst nur eine Abkürzung. Mit dem http-Dienst können Sie alles tun.

John Smith
quelle
Ich bin nicht sicher, ob ich $ resource als Verknüpfung klassifizieren würde. Es ist ein Wrapper für $ http, daher wäre die direkte Verwendung von $ http "kürzer". Auf diese Weise können Sie $ http so konfigurieren, dass Sie bei Verwendung von $ http möglicherweise weniger Code haben. In einem Fall $http.get('/path/to/thing', params)versus myResource.get(params)plus tatsächlich die Konfiguration für myResource. Mehr Code im Voraus und funktioniert nur mit demselben API-Substantiv. Ansonsten codieren Sie genauso viel, als hätten Sie $ http verwendet.
Coblr
2

Eine Sache, die mir bei der Verwendung von $ resource über $ http aufgefallen ist, ist, wenn Sie die Web-API in .net verwenden

$ resource ist an einen Controller gebunden, der einen einzigen Zweck ausführt.

$ 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)
{
}

Während $ http von allem sein könnte. Geben Sie einfach die URL an.

$ http.get - "api / authenticate"

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

Es ist nur meine Meinung.

jayson.centeno
quelle
0

Der $ resource-Dienst unterstützt derzeit keine Versprechen und verfügt daher über eine deutlich andere Schnittstelle zum $ http-Dienst.

feurig
quelle
1
Der $ resource-Service unterstützt Versprechen, gibt jedoch kein $ Versprechen direkt zurück, wie dies bei $ http der Fall ist. Sie müssen es wie var myResource = $resource(...config...);dann irgendwo anders in dem Dienst tun, den Sie tun return myResource.get(..params...)oder Sie könnenvar save = myResource.save(); save.$promise.then(...fn...); return save;
Coblr