Ich habe einige Webdienste, die ich anrufen möchte. $resource
oder $http
welches 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?
Antworten:
$http
ist für allgemeine Zwecke AJAX. In den meisten Fällen verwenden Sie dies. Mit$http
Ihnen zu machen gehstGET
,POST
,DELETE
ruft Typ manuell und Verarbeitung der Objekte , die sie auf eigene Faust zurück.$resource
Wraps$http
zur 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 aufGET
die Ressource zu erhalten Ändern Sie es dann als JavaScript-Objekt und senden Sie es mit einem zurückPOST
oder löschen Sie es sogar mitDELETE
.... wenn das Sinn macht.
quelle
$resource
Service nur idiomatische / gut , wenn Ihre REST - Endpunkt unterstützt würdeGET
,POST
, undDELETE
? Die Dokumente ( docs.angularjs.org/api/ngResource.$resource ) zeigen, dass Sie diese 3 REST-Methoden mit erhalten$resource
.PUT
oder alles andere, was Sie möchtenGET
,POST
undDELETE
sind nur Standardeinstellungen. Wenn Sie einen Endpunkt haben, der dieselbe Ressource (das ist wichtig) für mehr als eine HTTP-Methode verarbeitet,$resource
ist dies eine gute Wahl..$promise
funktioniert das gutresolve
für Routing und Bindung.Ich habe das Gefühl, dass andere Antworten, obwohl sie richtig sind, die Wurzel der Frage nicht ganz erklären:
REST
ist eine Teilmenge vonHTTP
. Dies bedeutet, dass alles, was über erledigt werdenREST
kann, über erledigt werden kann,HTTP
aber nicht alles, was über erledigt werdenHTTP
kann, überREST
. Deshalb$resource
nutzt$http
intern.Also, wann man sich benutzt?
Wenn
REST
Sie nur versuchen, auf einenRESTful
Webservice zuzugreifen ,$resource
wird die Interaktion mit diesem Webservice sehr einfach.Wenn Sie stattdessen versuchen, auf ALLES zuzugreifen, was kein
RESTful
Webservice ist, müssen Sie mitgehen$http
. Denken Sie daran, dass Sie auch über auf einenRESTful
Webservice zugreifen können. Dies$http
ist 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 siejQuery.ajax
(äquivalent zu Angulars$http
) verwendet haben.quelle
$http
führt einen Allzweck-AJAX-Aufruf durch, wobei allgemein bedeutet, dass er RESTful- API und Non-RESTful- API enthalten kann.und
$resource
ist 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 abzurufenDies wird Ihnen ein Ressourcenobjekt , das mit einhergeht
get
,save
,query
,remove
,delete
automatisch Methoden.$http
Weg, um Daten abzurufenSehen Sie, wie wir jede allgemeine Operation in der RESTFul-API definieren müssen . Auch ein Unterschied ist , dass die
$http
Renditen ,promise
während$resource
ein Objekt zurückgegeben. Es gibt auch Drittanbieter - Plug - ins Eckige Deal mit helfen RESTful API wie restangularWenn die API so etwas wie ist
/api/getcarsinfo
. Alles was für uns übrig bleibt ist zu benutzen$http
.quelle
/api/getcarsinfo
, können wir sie$resource
Ich denke, die Antwort hängt mehr davon ab, wer Sie zum Zeitpunkt des Schreibens des Codes sind. Verwenden
$http
Sie diese Option, wenn Sie Angular noch nicht kennen, bis Sie wissen, warum Sie sie benötigen$resource
. Bis Sie konkrete Erfahrung haben , wie$http
Sie zurückhält, und Sie verstehen die Auswirkungen der Verwendung$resource
in 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:$http
Beispiele sind reichlich vorhanden, hilfreich und im Allgemeinen genau das, was Sie brauchen. Klare$resource
Beispiele 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$resource
Beispiele finden, die Ihnen helfen können.$http
ist 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
.$resource
bringt eine Menge Nuancen mit sich, für die Sie noch keine mentale Karte haben.$http
gibt ein Versprechen zurück und ist in der.then
Lage, 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.$resource
ist 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$http
selbst zu verarbeiten. Fügt jedem anderen$resource
eine 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
$http
Kind. Es ist in Ordnung."quelle
/user/:userId
oder verwenden/thing
. Sobald Sie zu wechseln, müssen/users/roles/:roleId
Sie die URL und die Parameter von $ resource pro Verb ändern, und Sie können an diesem Punkt auch $ http verwenden.$resource
und an einigen$http
Stellen 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$resource
Monate zu verfolgen.$http
ist so einfach und unkompliziert, dass jeder Gewinn$resource
durch die Lernkurve gründlich ausgelöscht wurde.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
quelle
Wenn es darum geht, zwischen
$http
oder$resource
technisch gesehen zu wählen, gibt es im Wesentlichen keine richtige oder falsche Antwort. Beide werden das Gleiche tun.Der Zweck von
$resource
besteht darin, Ihnen die Übergabe einer Vorlagenzeichenfolge (eine Zeichenfolge, die Platzhalter enthält) zusammen mit den Parameterwerten zu ermöglichen.$resource
ersetzt 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
$http
führen die asynchronen HTTP-Anforderungen aus.quelle
$resource
nicht asynchron arbeiten kannst?$http
die einfachste Möglichkeit ist, asynchrone HTTP-Anforderungen auszuführen, und was im$resource
Wesentlichen dasselbe tut, jedoch mit unterschiedlichen ParameternDer 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.
quelle
$http.get('/path/to/thing', params)
versusmyResource.get(params)
plus tatsächlich die Konfiguration fürmyResource
. Mehr Code im Voraus und funktioniert nur mit demselben API-Substantiv. Ansonsten codieren Sie genauso viel, als hätten Sie $ http verwendet.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'});
Während $ http von allem sein könnte. Geben Sie einfach die URL an.
$ http.get - "api / authenticate"
Es ist nur meine Meinung.
quelle
Der $ resource-Dienst unterstützt derzeit keine Versprechen und verfügt daher über eine deutlich andere Schnittstelle zum $ http-Dienst.
quelle
var myResource = $resource(...config...);
dann irgendwo anders in dem Dienst tun, den Sie tunreturn myResource.get(..params...)
oder Sie könnenvar save = myResource.save(); save.$promise.then(...fn...); return save;