javascript - query - npm angularjs resource
AngularJS $ http y $ resource (9)
Creo que es importante enfatizar que $ resource espera un objeto o una matriz como respuesta del servidor, no de una cadena en bruto. Por lo tanto, si tiene una cadena en bruto (o cualquier cosa, excepto el objeto y la matriz) como respuesta, debe usar $ http
Tengo algunos servicios web que quiero llamar. $resource
o $http
, ¿cuál debería usar?
$resource
: https://docs.angularjs.org/api/ngResource/service/$resource
$http
: https://docs.angularjs.org/api/ng/service/$http
Después de leer las dos páginas API anteriores, estoy perdido.
¿Podría por favor explicarme en inglés simple cuál es la diferencia y en qué situación debo usarlos? ¿Cómo estructuro estas llamadas y leo los resultados en objetos js correctamente?
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 tenga experiencia concreta de cómo $http
está frenando, y comprende las implicaciones de usar $resource
en su código , quédese con $http
.
Esta fue mi experiencia: comencé mi primer proyecto Angular, necesitaba realizar solicitudes HTTP a una interfaz REST, por lo que hice la misma investigación que está haciendo ahora. Basado en la discusión que leí en SO preguntas como esta, elegí ir con $resource
. Este fue un error que desearía poder deshacer. Este es el por qué:
-
$http
ejemplos de$http
son abundantes, útiles y, en general, solo lo que necesita. Los ejemplos claros$resource
son escasos y (en mi experiencia) rara vez todo lo que necesita. Para el novato de Angular, no se dará cuenta de las implicaciones de su elección hasta más adelante, cuando esté atorado con la documentación y enojado porque no puede encontrar ejemplos de$resource
útiles para ayudarlo. -
$http
es probablemente un mapa mental 1-a-1 de lo que estás buscando. No tiene que aprender un nuevo concepto para entender lo que obtiene con$http
.$resource
trae consigo muchos matices por los que aún no tienes un mapa mental. - Vaya, ¿dije que no tienes que aprender un nuevo concepto? Como novato en Angular , tienes que aprender acerca de las promesas.
$http
devuelve una promesa y es.then
capaz, por lo que encaja perfectamente con las nuevas cosas que estás aprendiendo sobre Angular y promesas.$resource
, que no devuelve una promesa directamente, complica su comprensión tentativa sobre los fundamentos angulares. -
$resource
es poderoso porque condensa el código para llamadas CRUD RESTful y las transformaciones para entrada y salida. Eso es genial si estás cansado de escribir código repetidamente para procesar los resultados de$http
ti mismo. Para cualquier otra persona,$resource
agrega una capa críptica de sintaxis y paso de parámetros que es confuso.
Ojalá me conociera hace 3 meses y me estaría diciendo enfáticamente: "Quédate con $http
kid. Está bien".
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 la plantilla con los valores de los parámetros que se pasan como un objeto. Esto es útil sobre todo cuando se interactúa con el origen de datos RESTFul, ya que utilizan principios similares para definir las URL.
Lo que $http
hace es realizar las solicitudes HTTP asíncronas.
El servicio $ resource actualmente no admite promesas y, por lo tanto, tiene una interfaz distinta al servicio $ http.
El servicio de recursos es un servicio útil para trabajar con APSI de REST. cuando lo usas no escribes tus métodos CRUD (crear, leer, actualizar y eliminar)
Por lo que veo, el servicio de recursos es solo un acceso directo, puede hacer cualquier cosa con el servicio http.
Siento que otras respuestas, aunque son correctas, no explican del todo 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
se puede hacer a través de HTTP
pero no todo lo que se puede hacer a través de HTTP
se 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á intentando acceder a un RESTful
web RESTful
, $resource
hará que sea muy fácil interactuar con ese servicio web.
Si, por el contrario, intenta acceder a CUALQUIER COSA que no sea un RESTful
web de RESTful
, tendrá que ir con $http
. Tenga en cuenta que también puede acceder a un RESTful
web RESTful
través de $http
, simplemente será mucho más incómodo que con $resource
. Esta es la forma en que la mayoría de las personas lo han estado haciendo fuera de AngularJS, utilizando jQuery.ajax
(equivalente a $http
de Angular).
Una cosa que noté cuando uso $ resource over $ http es si está usando la API web en .net
$ resource está vinculado a un controlador que ejecuta un solo propósito.
$ 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 podría ser de cualquier cosa. sólo tiene que especificar la url.
$ http.get - "api / authenticate"
[HttpGet]
public bool Authenticate(string email, string password)
{
return _authenticationService.LogIn(email, password, false);
}
Es solo mi opinión.
$http
es para fines generales AJAX. En la mayoría de los casos esto es lo que vas a usar. Con $http
, realizarás llamadas de tipo GET
, POST
, DELETE
forma manual y procesando los objetos que devuelven por tu cuenta.
$resource
wraps $http
para usar en escenarios de API web RESTful.
Hablando MUY en general: un servicio web RESTful será un servicio con un punto final para un tipo de datos que hace diferentes cosas con ese tipo de datos basado en métodos HTTP como GET
, POST
, PUT
, DELETE
, etc. Así que con un $resource
, puede llame a GET
para obtener el recurso como un objeto JavaScript, luego modifíquelo y envíelo de vuelta con un POST
, o incluso elimínelo con DELETE
.
... Si eso tiene sentido.
$http
realiza una llamada AJAX de propósito general, en la que generalmente significa que puede incluir una API RESTful más una API no RESTful .
y $resource
está especializado para esa parte RESTful .
El Api en reposo llegó a prevalecer en los últimos años porque la url está mejor organizada en lugar de url aleatoria compuesta por programadores.
Si utilizo una API RESTful para construir la url, sería algo como /api/cars/:carId
.
$resource
forma de recuperar 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 https://docs.angularjs.org/api/ngResource/service/$resource , que se acompaña de métodos de get
, save
, query
, remove
y delete
automática.
$http
forma de recuperar 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 la API RESTFul . También una diferencia es que $http
devuelve la promise
mientras que $resource
devuelve un objeto. También hay complementos de terceros para ayudar a Angular a lidiar con la API restangular como restangular
Si la API es algo como /api/getcarsinfo
. Todo lo que nos queda es usar $http
.