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?

Author: Cœur, 2012-11-01

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.

 163
Author: Ben Lesh,
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).

 204
Author: bluehallu,
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.

 38
Author: Qiang,
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é:

  1. $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.
  2. $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.
  3. 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 .thencapaz, 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.
  4. $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."

 28
Author: Matthew Marichiba,
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

 22
Author: sparrkli,
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.

 7
Author: Dalorzo,
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.

 2
Author: john Smith,
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.

 2
Author: jayson.centeno,
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.

 0
Author: firdous,
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