AngularJS $ http e $ risorse


257

Ho alcuni servizi web che voglio chiamare. $resourceo $httpquale 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 precedenti, mi sono perso.

Potresti spiegarmi in parole povere qual è la differenza e in quale situazione dovrei usarle? Come strutturare queste chiamate e leggere correttamente i risultati negli oggetti js?


25
$ resource si basa su $ http e fornisce ulteriore astrazione dalle comunicazioni sottostanti. Richiede anche un end-point REST conforme ai modelli $ resource. Dal momento che stai chiedendo, il mio suggerimento è di iniziare con $ http, fare conoscenza e poi vedere se è possibile passare a $ risorsa.
David Riccitelli,

4
Grazie per la risposta. Quindi, in quale situazione $ http è mai preferito rispetto a $ resource oltre a quello che posso conoscere l'API?
Tom,

Risposte:


168

$httpè per uso generale AJAX. Nella maggior parte dei casi questo è ciò che userete. Con $httpsi sta andando ad essere fare GET, POST, DELETEtipo chiama manualmente ed elaborare gli oggetti tornano da soli.

$resourceesegue il wrapping $httpper l'utilizzo in scenari API Web RESTful.


Parlando molto in generale: servizio web un sonno sarà un servizio con un endpoint per un tipo di dati che fa cose diverse con quel tipo di dati in base a metodi come HTTP GET, POST, PUT, DELETE, ecc Quindi con una $resource, è possibile chiamare una GETper ottenere la risorsa come oggetto JavaScript, quindi modificalo e rispediscilo con un POST, o addirittura cancellalo con DELETE.

... se questo ha senso.


1
Quindi $ resource gestisce i servizi Restful, ciò significa che può essere utilizzato anche per chiamare i normali servizi Web? Dal momento che OTTIENI POST ELIMINA Metti tutto questo. Quindi, in quale situazione $ http è mai preferito rispetto a $ resource?
Tom,

7
Davvero ogni volta che non hai a che fare con un endpoint veramente riposante. Aggiunge molte funzionalità di cui non avresti bisogno se il tuo endpoint consentiva di ottenere GET, ad esempio.
Ben Lesh,

@blesh, in modo da utilizzare il $resourceservizio sarebbe solo idiomatica / buona se i vostri supporti REST endpoint GET, POST, e DELETE ? I documenti ( docs.angularjs.org/api/ngResource.$resource ) mostrano che si ottengono questi 3 metodi REST con $resource.
Kevin Meredith,

9
@KevinMeredith: O qualsiasi numero di metodo. Puoi aggiungere PUTo qualsiasi altra cosa tu voglia GET, POSTe DELETEsono solo valori predefiniti. Se si dispone di un endpoint che si occupa della stessa risorsa (che è importante) per più di un metodo HTTP, allora $resourceè una buona scelta.
Ben Lesh,

Anche per un endpoint none-RESTful, ho trovato conveniente usare $ resource per i dati di tipo GET e QUERY. Dato il modo in cui .$promisefunziona bene resolveper il routing e l'associazione.
Kevin,

210

Sento che altre risposte, benché corrette, non spiegano del tutto la radice della domanda: RESTè un sottoinsieme di HTTP. Ciò significa che tutto ciò che può essere fatto tramite RESTpuò essere fatto tramite HTTPma non tutto ciò che può essere fatto tramite HTTPpuò essere fatto tramite REST. Ecco perché $resourceutilizza $httpinternamente.

Quindi, quando usare l'un l'altro?

Se tutto ciò di cui hai bisogno è REST, cioè, stai provando ad accedere a un servizio RESTfulweb, $resourcerenderà super facile l'interazione con quel servizio web.

Se invece stai tentando di accedere a QUALSIASI cosa non sia un servizio RESTfulweb, dovrai andare avanti $http. Tieni presente che puoi anche accedere a un servizio RESTfulweb tramite $http, sarà solo molto più ingombrante che con $resource. Questo è il modo in cui la maggior parte delle persone lo ha fatto al di fuori di AngularJS, usando jQuery.ajax(equivalente di Angular $http).


21
bella risposta, questo dovrebbe essere accettato, non quello in cima
Andrzej Rehmann,

2
Significa che abbiamo tre modi per chiamare RESTful ?? Usando $ resource, $ http e jquery.ajax, ho ragione ??
Jake Huang,

4
@JakeHuang Puoi chiamarlo anche senza alcuna libreria, ci sono infiniti modi per farlo. Ho appena esposto i 2 approcci più popolari nel mondo AngularJS e l'approccio più comune al di fuori di esso.
Bluehallu,

Posso sapere quali sono i 2 approcci più popolari in AngularJS? : p
Jake Huang,

41

$httpeffettua una chiamata AJAX per scopi generici, in cui in generale può includere API RESTful più Non RESTful .

ed $resourceè specializzato per quella parte RESTful .

Api riposante diventata diffusa negli ultimi anni perché l'URL è meglio organizzato invece dell'url casuale creato dai programmatori.

Se uso un'API RESTful per costruire l'URL, sarebbe qualcosa di simile /api/cars/:carId.

$resource modo 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 vi darà un oggetto risorsa , che è accompagnata con get, save, query, remove, deletemetodi automaticamente.

$http modo 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...
        }

Scopri come dobbiamo definire ogni operazione comune sull'API RESTFul . Inoltre una differenza è che $httprestituisce promisementre $resourcerestituisce un oggetto. Esistono anche plugin di terze parti per aiutare Angular a gestire l' API RESTFul come restangular


Se l'API è qualcosa di simile /api/getcarsinfo. Tutto quello che resta da noi è usare $http.


4
Questo dovrebbe essere il risponditore.
Royi Namir,

1
Se l'api è, /api/getcarsinfosuppongo che possiamo ancora usare$resource
kittu

1
Questo dovrebbe essere il risponditore. quando hai detto "Anche una differenza è che $ http restituisce promessa mentre $ resource restituisce un oggetto" 1- significa che non ho bisogno di usare .then con $ resource? 2- anche come persona frontend e questo potrebbe sembrare sciocco come posso sapere se l'API è riposante o no? grazie
shireef khatab il

1
@shireefkhatab 1. Sì, $ resource è solo un'astrazione di livello superiore di $ http per la connettività API RESTFul. Il esempio doc mostra come usarlo. 2. Dipende totalmente da come il tuo ragazzo di backend progetta l'URL. Se vuole conformarsi al paradigma api RESTFul, allora sei a posto
Qiang

30

Penso che la risposta dipenda maggiormente da chi sei nel momento in cui stai scrivendo il codice. Usa $httpse non conosci Angular, finché non sai perché ne hai bisogno $resource. Fino a quando non hai esperienza concreta di come $httpti trattiene e capisci le implicazioni dell'uso $resourcenel tuo codice , segui $http.

Questa è stata la mia esperienza: ho iniziato il mio primo progetto angolare, 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 seguire $resource. Questo è stato un errore che vorrei poter annullare. Ecco perché:

  1. $httpgli esempi sono abbondanti, utili e generalmente solo ciò di cui hai bisogno. $resourceEsempi chiari sono scarsi e (nella mia esperienza) raramente tutto ciò di cui hai bisogno. Per il neofita di Angular, non ti renderai conto delle implicazioni della tua scelta fino a dopo, quando sei bloccato a scervellarti sulla documentazione e arrabbiato che non riesci a trovare $resourceesempi utili per aiutarti.
  2. $httpè probabilmente una mappa mentale 1 a 1 di ciò che stai cercando. Non devi imparare un nuovo concetto per capire cosa ottieni $http.$resourceporta un sacco di sfumature che non hai ancora una mappa mentale.
  3. Oops, ho detto che non devi imparare un nuovo concetto? Come un principiante angolare si fa necessario conoscere le promesse. $httprestituisce una promessa ed è in .thengrado, quindi si adatta perfettamente alle nuove cose che stai imparando su Angular e promesse. $resource, che non restituisce direttamente una promessa, complica la tua comprensione provvisoria sui fondamenti angolari.
  4. $resourceè potente perché condensa il codice per le chiamate RESTful CRUD e le trasformazioni per input e output. È fantastico se sei stanco di scrivere ripetutamente codice per elaborare i risultati di $httpte stesso. A chiunque altro, $resourceaggiunge uno strato criptico di sintassi e passaggio di parametri che confonde.

Vorrei conoscermi 3 mesi fa e mi direi con enfasi: "Resta con $http Resta bambino. Va bene."


1
Mi piace la tua risposta, in particolare l'ultima riga. Attualmente sto attraversando un cambiamento nell'uso di $ resource vs $ http. L'unica cosa che aggiungerei è anche che $ resource è davvero utile e aiuta davvero quando stai usando lo stesso nome API , come /user/:userIdo /thing. Una volta passato a, /users/roles/:roleIddovrai modificare l'URL $ $ e i parametri in base al verbo e potresti anche usare $ http a quel punto.
coblr,

3
Chiamami schizofrenico per commentare la mia risposta, ma ho pensato di menzionare esperienze più recenti. Sono stato refactoring per eliminare $resourcee passare $httpin posti. Non posso sottolineare abbastanza quanto vorrei desiderare di non aver mai incontrato $resource. Probabilmente ho perso più di una settimana a cercare le sfumature di $resourcequesti mesi. $httpè così facile e diretto, qualsiasi guadagno da ottenere è $resourcestato completamente spazzato via dalla curva di apprendimento.
Matthew Marichiba,

24

Penso che sia importante sottolineare che $ resource prevede l'oggetto o l'array come risposta dal server, non una stringa non elaborata. Quindi, se si dispone di una stringa non elaborata (o qualsiasi altra cosa tranne oggetto e matrice) come risposta, è necessario utilizzare $ http


Ciò significa che $ http non supporta oggetti e array? Volevo solo chiarire.
Shardul,

Credo che $ http supporti oggetti, matrici e stringhe - avrei bisogno di conferma a riguardo
Katana24

@Shardul, ho capito che $ http si occupa di qualsiasi tipo di risposta, ma $ resource si occupa solo di oggetti e array.
Shireef Khatab,

Non è vero, puoi comunque usare $ resource per restituire una stringa. Utilizzare 'transformResponse' nel codice frontend per racchiudere la stringa restituita in un oggetto.
Terry Deng

7

Quando si tratta di scegliere tra $httpo$resource tecnicamente parlando non esiste una risposta giusta o sbagliata in sostanza, entrambi faranno lo stesso.

Lo scopo di $resourceè consentire all'utente di passare una stringa di modello (una stringa che contiene segnaposto) insieme ai valori dei parametri. $resourcesostituirà i segnaposto dalla stringa del modello con i valori dei parametri che vengono passati come oggetto. Ciò è utile soprattutto quando si interagisce con l'origine dati RESTFul poiché utilizzano principi simili per definire gli URL.

Quello che $httpfa è eseguire le richieste HTTP asincrone.


1
Questa è una buona risposta perché sottolinea che $ http è ciò che alimenta le richieste da $ resource, e che entrambi fanno essenzialmente la stessa cosa.
coblr,

@Dalorzo Quindi vuoi dire che $resourcenon puoi eseguire Asincrono? Volevo solo chiarire
Kittu il

No, quello che ho sottolineato è che alla fine $httpè il modo più semplice per eseguire richieste HTTP asincrone e ciò che $resourceessenzialmente fa lo stesso ma con parametri diversi
Dalorzo

2

il servizio risorse è solo un servizio utile per lavorare con APSI REST. quando lo usi non scrivi i tuoi metodi CRUD (crea, leggi, aggiorna ed elimina)

A mio avviso, il servizio risorse è solo un collegamento, puoi fare qualsiasi cosa con il servizio http.


Non sono sicuro che classificherei $ resource come scorciatoia. È un wrapper per $ http, quindi usare $ http direttamente sarebbe "più breve". È un modo per configurare $ http in modo da avere potenzialmente meno codice quando si utilizza $ http. In un caso $http.get('/path/to/thing', params)contro myResource.get(params)più facendo effettivamente la configurazione per myResource. Più codice in anticipo e funziona davvero solo con lo stesso nome API. Altrimenti, stai codificando tanto quanto se avessi usato $ http.
coblr,

2

Una cosa che ho notato quando si utilizza $ resource oltre $ http è se si utilizza l'API Web in .net

$ resource è legata in un controller che esegue un unico 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 / autenticare"

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

è solo la mia opinione.


0

Il servizio $ resource attualmente non supporta le promesse e quindi ha un'interfaccia nettamente diversa rispetto al servizio $ http.


1
Il servizio $ resource supporta le promesse, ma non restituisce una promessa $ direttamente come $ http. Devi farlo come var myResource = $resource(...config...);allora da qualche altra parte nel servizio che fai return myResource.get(..params...)o puoi farevar save = myResource.save(); save.$promise.then(...fn...); return save;
coblr
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.