AngularJS http http y resource resource
Tengo algunos servicios web a los que quiero llamar. $resource
o $http
, cuál debo usar?
$resource
: https://docs.angularjs.org/api/ngResource/service / resource resource
$http
: https://docs.angularjs.org/api/ng/service/$http
Después de leer las dos páginas API anteriores estoy perdido.
¿Podría explicarme en un lenguaje sencillo cuál es la diferencia y en qué situación debo usarlos? Cómo estructuro estas llamadas y leo los resultados en js objects correctamente?
9 answers
$http
es para uso general AJAX. En la mayoría de los casos, esto es lo que usarás. Con $http
vas a estar haciendo GET
, POST
, DELETE
escriba las llamadas manualmente y procese los objetos que devuelven por su cuenta.
$resource
envuelve $http
para su uso en escenarios de API web RESTful.
Hablando MUY generalmente: Un servicio web RESTful será un servicio con un punto final para un tipo de datos que hace cosas diferentes con ese tipo de datos basado en métodos HTTP como GET
, POST
, PUT
, DELETE
, etc. Así que con un $resource
, puede llamar a un GET
para obtener el recurso como un objeto JavaScript, luego alterarlo y enviarlo de vuelta con un POST
, o incluso eliminarlo con DELETE
.
... si eso tiene sentido.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-14 15:08:45
Siento que otras respuestas, aunque correctas, no explican la raíz de la pregunta: REST
es un subconjunto de HTTP
. Esto significa que todo lo que se puede hacer a través de REST
puede hacer a través de HTTP
pero no todo lo que se puede hacer a través de HTTP
puede hacer a través de REST
. Es por eso que $resource
usa $http
internamente.
Entonces, ¿cuándo usarnos?
Si todo lo que necesita es REST
, es decir, está tratando de acceder a un RESTful
servicio web, $resource
va a hacer que sea súper fácil interactúe con ese servicio web.
Si en cambio, estás intentando acceder a CUALQUIER COSA que no sea un RESTful
webservice, vas a tener que ir con $http
. Tenga en cuenta que también podría acceder a un RESTful
webservice a través de $http
, será mucho más engorroso que con $resource
. Esta es la forma en que la mayoría de la gente lo ha estado haciendo fuera de AngularJS, usando jQuery.ajax
(equivalente a $http
de Angular).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-04 09:19:14
$http
hace una llamada AJAX de propósito general, en la que general significa que puede incluir api RESTful más api No RESTful .
Y $resource
está especializado para esa parte de descanso.
Restful Api llegó a prevalecer en los últimos años porque la url está mejor organizada en lugar de la url aleatoria compuesta por programadores.
Si utilizo una API RESTful para construir la url, sería algo así como /api/cars/:carId
.
$resource
forma de obtener datos
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');
}]);
Esto le dará un objeto de recurso , que se acompaña con get
, save
, query
, remove
, delete
métodos automáticamente.
$http
forma de obtener datos
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...
}
Vea cómo necesitamos definir cada operación común en RESTful API. También una diferencia es que $http
devuelve promise
mientras que $resource
devuelve un objeto. También hay complementos de terceros para ayudar a Angular a lidiar con RESTful API like restangular
Si la API es algo así como /api/getcarsinfo
. Todo lo que nos queda es usar $http
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-14 02:50:30
Creo que la respuesta depende más de quién eres en el momento en que escribes el código. Use $http
si es nuevo en Angular, hasta que sepa por qué necesita $resource
. Hasta que tengas experiencia concreta de cómo $http
te está reteniendo, y entiendas las implicaciones de usar $resource
en tu código, sigue con $http
.
Esta fue mi experiencia: comencé mi primer proyecto Angular, necesitaba hacer solicitudes HTTP a una interfaz RESTful, así que hice lo mismo la investigación que estás haciendo ahora. Basado en la discusión que leí en preguntas como esta, elegí ir con $resource
. Este fue un error que desearía poder deshacer. He aquí por qué:
-
$http
los ejemplos son abundantes, útiles y, en general, justo lo que necesita. Los ejemplos claros$resource
son escasos, y (en mi experiencia) rara vez todo lo que necesitas. Para el novato Angular, no se dará cuenta de las implicaciones de su elección hasta más tarde, cuando esté atrapado desconcertando sobre la documentación y enojado porque no puedes encontrar$resource
ejemplos útiles para ayudarte. -
$http
es probablemente un mapa mental 1 a 1 de lo que estás buscando. No tienes que aprender un nuevo concepto para entender lo que obtienes con$http
.$resource
trae consigo muchos matices para los que aún no tienes un mapa mental. - Oops, ¿dije que no tienes que aprender un nuevo concepto? Como novato angular que hacer tiene que aprender acerca de las promesas.
$http
devuelve una promesa y es.then
capaz, por lo que encaja perfectamente con las cosas nuevas que estás aprendiendo acerca de Angular y promesas.$resource
, que no devuelve una promesa directamente, complica su comprensión tentativa de los fundamentos Angulares. -
$resource
es potente porque condensa el código para llamadas RESTful CRUD y las transformaciones para entrada y salida. Eso es genial si estás harto de escribir código repetidamente para procesar los resultados de$http
tú mismo. Para cualquier otra persona,$resource
agrega una capa críptica de sintaxis y paso de parámetros que es confusa.
Desearía conocerme hace 3 meses, y me estaría diciendo enfáticamente: "Quédate con $http
kid. Está bien."
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-04 22:26:38
Creo que es importante enfatizar que resource resource espera un objeto o una matriz como respuesta del servidor, no una cadena sin procesar. Por lo tanto, si tiene una cadena sin procesar (o cualquier cosa excepto objeto y matriz) como respuesta, debe usar http http
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-01 12:55:44
Cuando se trata de elegir entre $http
o $resource
técnicamente hablando, no hay una respuesta correcta o incorrecta, en esencia, ambos harán lo mismo.
El propósito de $resource
es permitirle pasar una cadena de plantilla (una cadena que contiene marcadores de posición) junto con los valores de los parámetros. $resource
reemplazará los marcadores de posición de la cadena de plantilla con los valores de parámetro que se pasan como un objeto. Esto es principalmente útil cuando se interactúa con la fuente de datos RESTful a medida que se usa principios similares para definir las URLs.
Lo que hace $http
es realizar las Peticiones HTTP Asíncronas.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-26 12:55:40
Resource service es solo un servicio útil para trabajar con REST APSIs. cuando lo usas no escribes tus métodos CRUD (crear,leer,actualizar y eliminar)
Por lo que veo, resource service es solo un atajo, puedes hacer cualquier cosa con el servicio http.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-22 16:09:28
Una cosa que noté al usar resource resource sobre http http es si está utilizando Web API en. net
Resource resource está atado a un controlador que ejecuta un solo propósito.
Resource 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)
{
}
Mientras que http http podría ser de cualquier cosa. simplemente especifique la url.
Http http.get - "api / authenticate"
[HttpGet]
public bool Authenticate(string email, string password)
{
return _authenticationService.LogIn(email, password, false);
}
Es solo mi opinión.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-06 02:13:20
El servicio resource resource actualmente no soporta promesas y por lo tanto tiene una interfaz claramente diferente al servicio http http.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-12 12:18:49