AngularJS $http and $resource
I am newly exposed to AngularJS, so please forgive my ignorance.
I have some web services that I want to call. $resource
or $http
, which one should I use?
$resource
: https://docs.angularjs.org/api/ngResource/service/$resource
$http
: https://docs.angularjs.org/api/ng/service/$http
After I read the two above API pages I am lost.
Could you please explain to me in plain English what is the difference and in what situation should I use them? How do I structure these calls and read the results into js objects correctly?
$http
is for general purpose AJAX. In most cases this is what you'll be using. With $http
you're going to be making GET
, POST
, DELETE
type calls manually and processing the objects they return on your own.
$resource
wraps $http
for use in RESTful web API scenarios.
Speaking VERY generally: A RESTful web service will be a service with one endpoint for a data type that does different things with that data type based on HTTP methods like GET
, POST
, PUT
, DELETE
, etc. So with a $resource
, you can call a GET
to get the resource as a JavaScript object, then alter it and send it back with a POST
, or even delete it with DELETE
.
... if that makes sense.
I feel that other answers, while correct, don't quite explain the root of the question: REST
is a subset of HTTP
. This means everything that can be done via REST
can be done via HTTP
but not everything that can be done via HTTP
can be done via REST
. That is why $resource
uses $http
internally.
So, when to use each other?
If all you need is REST
, that is, you are trying to access a RESTful
webservice, $resource
is going to make it super easy to interact with that webservice.
If instead, you're trying to access ANYTHING that is not a RESTful
webservice, you're going to have to go with $http
. Keep in mind, you could also access a RESTful
webservice via $http
, it will just be much more cumbersome than with $resource
. This is the way most people have been doing it outside AngularJS, by using jQuery.ajax
(equivalent of Angular's $http
).
$http
makes general purpose AJAX call, in which general means it can include RESTful api plus Non-RESTful api.
and $resource
is specialized for that RESTful part.
Restful Api came to prevalent in recent years because the url is better organized instead of random url made up by programmers.
If I use a RESTful API to construct the url, it would be something like /api/cars/:carId
.
$resource
way to fetch data
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');
}]);
This will give you an resource object, which is accompanied with get
, save
, query
, remove
, delete
methods automatically.
$http
way to fetch data
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...
}
See how we need to define each common operation on RESTFul API. Also one difference is that $http
returns promise
while $resource
returns an object. There are also third-party plugins to help Angular deal with RESTFul API like restangular
If the API is something like /api/getcarsinfo
. All left for us is to use $http
.
上一篇: AngularJS:$ observe和$ watch方法之间的区别
下一篇: AngularJS $ http和$资源