J'ai quelques services Web que je veux appeler. $resource
ou $http
lequel dois-je utiliser?
$resource
: https://docs.angularjs.org/api/ngResource/service/$resource
$http
: https://docs.angularjs.org/api/ng/service/$http
Après avoir lu les deux pages API ci-dessus, je suis perdu.
Pourriez-vous s'il vous plaît m'expliquer en anglais simple quelle est la différence et dans quelle situation dois-je les utiliser? Comment structurer ces appels et lire correctement les résultats dans des objets js?
Réponses:
$http
est à usage général AJAX. Dans la plupart des cas, c'est ce que vous utiliserez. Avec$http
vous allez faireGET
,POST
, leDELETE
type appelle manuellement et traiter les objets qu'ils reviennent sur votre propre.$resource
encapsule$http
à utiliser dans les scénarios d'API Web RESTful.De façon très générale: Un service Web RESTful sera un service avec un point final pour un type de données qui fait des choses différentes avec ce type de données basées sur des méthodes HTTP aiment
GET
,POST
,PUT
,DELETE
, etc. Donc , avec un$resource
, vous pouvez appelerGET
pour obtenir la ressource en tant qu'objet JavaScript, puis modifiez-le et renvoyez-le avec unPOST
, ou même supprimez-le avecDELETE
.... si ça a du sens.
la source
$resource
service serait seulement idiomatiques / bien si vos supports d'extrémité RESTGET
,POST
, etDELETE
? Les documents ( docs.angularjs.org/api/ngResource.$resource ) montrent que vous obtenez ces 3 méthodes REST avec$resource
.PUT
ou tout ce que vous souhaitezGET
,POST
et neDELETE
sont que des valeurs par défaut. Si vous avez un point de terminaison qui traite de la même ressource (ce qui est important) pour plusieurs méthodes HTTP,$resource
c'est un bon choix..$promise
fonctionne bienresolve
pour le routage et la liaison.Je pense que d'autres réponses, bien que correctes, n'expliquent pas tout à fait la racine de la question:
REST
est un sous-ensemble deHTTP
. Cela signifie que tout ce qui peut être fait viaREST
peut être fait viaHTTP
mais pas tout ce qui peut être fait viaHTTP
ne peut pas être fait viaREST
. C'est pourquoi$resource
utilise en$http
interne.Alors, quand utiliser les uns les autres?
Si tout ce dont vous avez besoin
REST
, c'est que vous essayez d'accéder à un serviceRESTful
Web,$resource
rendra l'interaction avec ce service Web très facile.Si, à la place, vous essayez d'accéder à TOUT ce qui n'est pas un service
RESTful
Web, vous devrez y aller$http
. Gardez à l'esprit que vous pouvez également accéder à un serviceRESTful
Web via$http
, il sera juste beaucoup plus lourd qu'avec$resource
. C'est la façon dont la plupart des gens l'ont fait en dehors d'AngularJS, en utilisantjQuery.ajax
(l'équivalent d'Angular$http
).la source
$http
effectue un appel AJAX à usage général, ce qui signifie généralement qu'il peut inclure une API RESTful plus une API non RESTful .et
$resource
est spécialisé pour cette partie RESTful .Api reposant est devenu répandu ces dernières années parce que l'url est mieux organisée au lieu d'une URL aléatoire composée par des programmeurs.
Si j'utilise une API RESTful pour construire l'URL, ce serait quelque chose comme
/api/cars/:carId
.$resource
façon de récupérer des donnéesCela vous donnera un objet ressource , qui est accompagné
get
,save
,query
,remove
,delete
méthodes automatiquement.$http
façon de récupérer des donnéesDécouvrez comment nous devons définir chaque opération commune sur l' API RESTFul . Une différence est également que
$http
renvoiepromise
while$resource
renvoie un objet. Il existe également des plugins tiers pour aider Angular à gérer l'API RESTFul comme restangularSi l'API ressemble à quelque chose
/api/getcarsinfo
. Il ne nous reste plus qu'à utiliser$http
.la source
/api/getcarsinfo
je suppose que nous pouvons toujours utiliser$resource
Je pense que la réponse dépend davantage de qui vous êtes au moment où vous écrivez le code. À utiliser
$http
si vous débutez avec Angular, jusqu'à ce que vous sachiez pourquoi vous en avez besoin$resource
. Jusqu'à ce que vous ayez une expérience concrète de la façon dont$http
vous vous retenez et que vous compreniez les implications de l'utilisation$resource
dans votre code , restez avec$http
.Ce fut mon expérience: j'ai commencé mon premier projet Angular, j'avais besoin de faire des requêtes HTTP à une interface RESTful, donc j'ai fait la même recherche que vous faites maintenant. Sur la base de la discussion que j'ai lue dans des questions SO comme celle-ci, j'ai choisi d'y aller
$resource
. C'était une erreur que j'aurais aimé pouvoir annuler. Voici pourquoi:$http
les exemples sont nombreux, utiles et généralement juste ce dont vous avez besoin. Les$resource
exemples clairs sont rares et (selon mon expérience) rarement tout ce dont vous avez besoin. Pour le débutant Angular, vous ne réaliserez les implications de votre choix que plus tard, lorsque vous serez coincé par la documentation et en colère de ne pas trouver d'$resource
exemples utiles pour vous aider.$http
est probablement une carte mentale 1 à 1 de ce que vous recherchez. Vous n'avez pas besoin d'apprendre un nouveau concept pour comprendre ce que vous obtenez$http
.$resource
apporte beaucoup de nuances pour lesquelles vous n'avez pas encore de carte mentale.$http
renvoie une promesse et est.then
capable, donc il s'intègre parfaitement avec les nouvelles choses que vous apprenez sur Angular et les promesses.$resource
, qui ne renvoie pas directement une promesse, complique votre compréhension provisoire des fondamentaux angulaires.$resource
est puissant car il condense le code des appels RESTful CRUD et les transformations d'entrée et de sortie. C'est génial si vous en avez marre d'écrire à plusieurs reprises du code pour traiter les résultats de$http
vous - même. Pour quelqu'un d'autre,$resource
ajoute une couche cryptique de syntaxe et de passage de paramètres qui prête à confusion.J'aimerais bien me connaître il y a 3 mois, et je me dirais avec emphase: "Reste avec l'
$http
enfant. C'est très bien."la source
/user/:userId
ou/thing
. Une fois que vous passez à,/users/roles/:roleId
vous devez modifier l'URL et les paramètres de $ resource par verbe et vous pourriez tout aussi bien utiliser $ http à ce stade.$resource
et passer à$http
certains endroits. Je ne saurais trop insister sur le souhait que j'aurais souhaité n'avoir jamais rencontré$resource
. J'ai probablement perdu plus d'une semaine à chasser les nuances de$resource
ces derniers mois.$http
est si facile et simple, tout gain à gagner a$resource
été complètement effacé par la courbe d'apprentissage.Je pense qu'il est important de souligner que $ resource attend l'objet ou le tableau comme réponse du serveur, pas une chaîne brute. Donc, si vous avez une chaîne brute (ou quoi que ce soit sauf un objet et un tableau) comme réponse, vous devez utiliser $ http
la source
Quand il s'agit de choisir entre
$http
ou$resource
techniquement parlant, il n'y a pas de bonne ou de mauvaise réponse, les deux feront la même chose.Le but de
$resource
est de vous permettre de passer une chaîne de modèle (une chaîne qui contient des espaces réservés) avec les valeurs des paramètres.$resource
remplacera les espaces réservés de la chaîne de modèle par les valeurs de paramètre celles transmises en tant qu'objet. Cela est surtout utile lors de l'interaction avec la source de données RESTFul car ils utilisent des principes similaires pour définir les URL.Qu'est
$http
- ce que c'est, c'est d'exécuter les requêtes HTTP asynchrones.la source
$resource
vous ne pouvez pas effectuer de manière asynchrone? Je voulais juste clarifier$http
est le moyen le plus simple d'effectuer une demande HTTP asynchrone et ce qui fait$resource
essentiellement la même chose mais avec des paramètres différentsle service de ressources est juste un service utile pour travailler avec les APSI REST. lorsque vous l'utilisez, vous n'écrivez pas vos méthodes CRUD (créer, lire, mettre à jour et supprimer)
Pour autant que je le vois, le service de ressources n'est qu'un raccourci, vous pouvez tout faire avec le service http.
la source
$http.get('/path/to/thing', params)
versusmyResource.get(params)
plus fait la configuration demyResource
. Plus de code à l'avant et ne fonctionne vraiment que de manière fluide avec le même nom d'API. Sinon, vous codez autant que si vous utilisiez $ http.Une chose que j'ai remarquée lors de l'utilisation de $ resource sur $ http est que vous utilisez l'API Web dans .net
$ resource est lié à un contrôleur qui exécute un seul objectif.
$ resource ('/ user /: userId', {userId: '@ id'});
Alors que $ http pourrait être de n'importe quoi. spécifiez simplement l'URL.
$ http.get - "api / authenticate"
c'est juste mon avis.
la source
Le service $ resource actuellement ne prend pas en charge les promesses et a donc une interface distinctement différente du service $ http.
la source
var myResource = $resource(...config...);
alors ailleurs dans le service que vous faitesreturn myResource.get(..params...)
ou vous pouvez fairevar save = myResource.save(); save.$promise.then(...fn...); return save;