AngularJS $ http e $ risorsa

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é:

  1. $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.
  2. $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.
  3. Oops, ho detto che non devi imparare un nuovo concetto? Come novizio angular devi conoscere le promesse. $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.
  4. $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.