Ho alcuni servizi Web che voglio chiamare. $resource
o $http
, quale dovrei usare?
$resource
: https://docs.angularjs.org/api/ngResource/service/$resource
$http
: https://docs.angularjs.org/api/ng/service/$http
Dopo aver letto le due pagine API sopra sono perso.
Potresti spiegarmi in inglese semplice quale è la differenza e in quale situazione dovrei usarli? Come strutturare queste chiamate e leggere correttamente i risultati negli oggetti js?
$http
è per uso generale AJAX. Nella maggior parte dei casi questo è quello che userete. Con $http
stai rendendo GET
, POST
, DELETE
digita le chiamate manualmente ed elabora gli oggetti che restituiscono da soli.
$resource
avvolge $http
per l’utilizzo in scenari API web RESTful.
Parlando MOLTO in generale: un servizio web RESTful sarà un servizio con un endpoint per un tipo di dati che fa cose diverse con quel tipo di dati basato su metodi HTTP come GET
, POST
, PUT
, DELETE
, ecc. Quindi con una $resource
, è ansible chiama un GET
per ottenere la risorsa come object JavaScript, quindi modificala e reinviala con un POST
o eliminala con DELETE
.
… se questo ha un senso.
Sento che altre risposte, pur corrette, non spiegano abbastanza la radice della domanda: REST
è un sottoinsieme di HTTP
. Ciò significa che tutto ciò che può essere fatto tramite REST
può essere fatto via HTTP
ma non tutto ciò che può essere fatto via HTTP
può essere fatto tramite REST
. Questo è il motivo $resource
cui $resource
utilizza $http
internamente.
Quindi, quando usarci l’un l’altro?
Se tutto ciò di cui hai bisogno è REST
, cioè stai provando ad accedere a un servizio RESTful
, $resource
renderà super facile interagire con quel webservice.
Se invece stai cercando di accedere a QUALSIASI COSA non è un servizio RESTful
, dovrai andare con $http
. Tieni presente che puoi accedere a un webservice RESTful
tramite $http
, sarà molto più complicato che con $resource
. Questo è il modo in cui molte persone lo hanno fatto fuori da AngularJS, usando jQuery.ajax
(equivalente di $http
di Angular).
$http
effettua una chiamata AJAX per scopi generali, in cui in generale significa che può includere RESTful api plus Non-RESTful api.
e $resource
è specializzata per quella parte RESTful .
L’Api riposante è diventata prevalente negli ultimi anni perché l’url è meglio organizzato al posto di un url casuale composto da programmatori.
Se utilizzo un’API RESTful per build l’url, sarebbe qualcosa di simile a /api/cars/:carId
.
$resource
per recuperare i dati
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'); }]);
Questo ti darà un object risorsa , che è accompagnato da get
, save
, query
, remove
, delete
methods automaticamente.
$http
per recuperare i dati
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... }
Guarda come dobbiamo definire ogni operazione comune sull’API RESTFul . Inoltre, una differenza è che $http
restituisce una promise
mentre $resource
restituisce un object. Esistono anche plugin di terze parti per aiutare Angular a gestire le API RESTFul come Restangular
Se l’API è qualcosa come /api/getcarsinfo
. Tutto ha lasciato per noi è usare $http
.
Penso che la risposta dipenda più da chi sei nel momento in cui stai scrivendo il codice. Usa $http
se sei nuovo in Angular, finché non sai perché hai bisogno $resource
. Finché non avrai esperienza concreta di come $http
ti trattiene e comprendi le implicazioni dell’uso $resource
nel tuo codice , segui $http
.
Questa è stata la mia esperienza: ho iniziato il mio primo progetto Angular, avevo bisogno di fare richieste HTTP a un’interfaccia RESTful, quindi ho fatto la stessa ricerca che stai facendo ora. Sulla base della discussione che ho letto in domande SO come questa, ho scelto di andare con $resource
. Questo è stato un errore che avrei potuto annullare. Ecco perché:
$http
esempi $http
sono abbondanti, utili e generalmente ciò di cui hai bisogno. Gli esempi di $resource
chiari sono scarsi e (nella mia esperienza) raramente tutto ciò di cui hai bisogno. Per il principiante Angolare, non ti renderai conto delle implicazioni della tua scelta fino a tardi, quando rimani incerto sulla documentazione e sei arrabbiato perché non riesci a trovare utili esempi di $resource
per aiutarti. $http
è probabilmente una mappa mentale 1-a-1 per quello che stai cercando. Non devi imparare un nuovo concetto per capire cosa ottieni con $http
. $resource
porta con sé molte sfumature che non hai ancora una mappa mentale. $http
restituisce una promise ed è, quindi, in grado di adattarsi perfettamente alle nuove cose che stai imparando su Angular e le promesse. $resource
, che non restituisce direttamente una promise, complica la tua tentativa comprensione dei fondamentali angolari. $resource
è potente perché condensa il codice per le chiamate CRUD RESTful e le trasformazioni per input e output. È fantastico se sei stufo di scrivere ripetutamente codice per elaborare i risultati di $http
. Per chiunque altro, $resource
aggiunge uno strato criptico di syntax e passaggio dei parametri che crea confusione. Mi piacerebbe conoscermi 3 mesi fa, e mi direi con enfasi: “Attacca con $http
kid. Va bene.”
Penso che sia importante sottolineare che $ resource si aspetta object o array come risposta dal server, non stringa raw. Quindi, se hai una stringa raw (o qualsiasi altra cosa tranne object e array) come risposta, devi usare $ http
Quando si tratta di scegliere tra $http
o $resource
tecnicamente parlando non c’è una risposta giusta o sbagliata, in sostanza entrambi faranno lo stesso.
Lo scopo della $resource
è di consentire il passaggio in una stringa di modello (una stringa che contiene segnaposto) insieme ai valori dei parametri. $resource
sostituirà i segnaposto dalla stringa del modello con i valori dei parametri che vengono passati come object. Ciò è utile soprattutto quando si interagisce con l’origine dati RESTFul poiché utilizzano principi simili per definire gli URL.
Che cosa fa $http
è eseguire le richieste asincrone HTTP.
il servizio risorse è solo un servizio utile per lavorare con APSI REST. quando lo usi non scrivi i tuoi metodi CRUD (crea, leggi, aggiorna e cancella)
Per quanto vedo, il servizio di risorse è solo una scorciatoia, puoi fare qualsiasi cosa con il servizio http.
Una cosa che ho notato usando $ resource su $ http è se stai usando l’API Web in .net
$ risorsa è legata a un controller che esegue un singolo scopo.
$ 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) { }
Mentre $ http potrebbe essere di qualsiasi cosa. basta specificare l’url.
$ http.get – “api / autenticate”
[HttpGet] public bool Authenticate(string email, string password) { return _authenticationService.LogIn(email, password, false); }
è solo la mia opinione.
Il servizio risorse $ attualmente non supporta le promesse e quindi ha un’interfaccia distintamente diversa rispetto al servizio $ http.