Tengo algunos servicios web a los que quiero llamar. $resourceo $http, ¿cuál debo 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 explicarme en inglés sencillo 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?

Respuestas:
$httpes de uso general AJAX. En la mayoría de los casos, esto es lo que usará. Con$httpvas a estar haciendoGET,POST,DELETEtipo manual de llamadas y procesamiento de los objetos regresan por su cuenta.$resourceenvolturas$httppara su uso en escenarios de API web RESTful.Hablando muy en general: Un servicio web REST será un servicio con un punto final para un tipo de datos que hace cosas diferentes con ese tipo de datos basado en HTTP métodos como
GET,POST,PUT,DELETE, etc Por lo tanto con una$resource, puede llamar a unaGETpara conseguir el recurso como un objeto JavaScript, luego modifíquelo y envíelo de vuelta con unPOST, o incluso elimínelo conDELETE.... Si eso tiene sentido.
fuente
$resourceservicio sólo sería idiomática / bueno si sus soportes RESTO de punto finalGET,POST, yDELETE? Los documentos ( docs.angularjs.org/api/ngResource.$resource ) muestran que obtienes estos 3 métodos REST$resource.PUTo cualquier otra cosa que deseeGET,POSTyDELETEson solo valores predeterminados. Si tiene un punto final que trata con el mismo recurso (eso es importante) para más de un método HTTP, entonces$resourcees una buena opción..$promisefunciona bienresolvepara el enrutamiento y el enlace.Siento que otras respuestas, aunque correctas, no explican la raíz de la pregunta:
RESTes un subconjunto deHTTP. Esto significa que todo lo que se puede hacer a través deRESTse puede hacer a través deHTTPpero no todo lo que se puede hacer a través deHTTPse puede hacer a través deREST. Es por eso que$resourceutiliza$httpinternamente.Entonces, ¿cuándo usarnos?
Si todo lo que necesita es
REST, es decir, si está intentando acceder a un servicioRESTfulweb, le$resourceserá muy fácil interactuar con ese servicio web.Si, en cambio, está intentando acceder a CUALQUIER COSA que no sea un servicio
RESTfulweb, tendrá que hacerlo$http. Tenga en cuenta que también puede acceder a un servicioRESTfulweb 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, utilizandojQuery.ajax(equivalente a Angular's$http).fuente
$httprealiza una llamada AJAX de propósito general, en la que en general significa que puede incluir una API RESTful más una API no RESTful .y
$resourceestá especializado para esa parte RESTful .La API de reposo prevaleció en los últimos años porque la URL está mejor organizada en lugar de una URL aleatoria compuesta por programadores.
Si uso una API RESTful para construir la url, sería algo así
/api/cars/:carId.$resourceforma de obtener datosEsto le dará un objeto de recursos , que se acompaña con
get,save,query,remove,deletemétodos automáticamente.$httpforma de obtener datosVea cómo necesitamos definir cada operación común en la API RESTFul . También una diferencia es que
$httpdevuelvepromisemientras$resourcedevuelve un objeto. También hay complementos de terceros para ayudar a Angular a lidiar con RESTFul API como restangularSi la API es algo así
/api/getcarsinfo. Todo lo que nos queda es usar$http.fuente
/api/getcarsinfo, supongo que todavía podemos usar$resourceCreo que la respuesta depende más de quién eres en el momento en que escribes el código. Úselo
$httpsi es nuevo en Angular, hasta que sepa por qué lo necesita$resource. Hasta que tenga una experiencia concreta de cómo lo$httpestá frenando, y comprenda las implicaciones de usar$resourceen su código , quédese con$http.Esta fue mi experiencia: comencé mi primer proyecto angular, necesitaba hacer solicitudes HTTP a una interfaz RESTful, así que hice la misma investigación que estás haciendo ahora. Basado en la discusión que leí en SO preguntas como esta, decidí seguir
$resource. Esto fue un error que desearía poder deshacer. Este es el por qué:$httpLos ejemplos son abundantes, útiles y, en general, justo lo que necesita. Los$resourceejemplos claros son escasos y (en mi experiencia) rara vez todo lo que necesita. Para el novato Angular, no se dará cuenta de las implicaciones de su elección hasta más tarde, cuando esté atrapado en la documentación y enojado porque no puede encontrar$resourceejemplos útiles para ayudarlo.$httpes probablemente un mapa mental 1 a 1 de lo que estás buscando. No tiene que aprender un nuevo concepto para comprender con qué se encuentra$http.$resourcetrae muchos matices para los que aún no tienes un mapa mental.$httpdevuelve una promesa y es.thencapaz, por lo que encaja perfectamente con las cosas nuevas que está aprendiendo sobre Angular y las promesas.$resource, que no devuelve una promesa directamente, complica su comprensión tentativa de los fundamentos angulares.$resourcees potente porque condensa el código para llamadas RESTful CRUD y las transformaciones para entrada y salida. Eso es genial si estás cansado de escribir código repetidamente para procesar los resultados de$httpti mismo. Para cualquier otra persona,$resourceagrega una capa críptica de sintaxis y paso de parámetros que es confusa.Ojalá me conociera hace 3 meses, y me estaría diciendo enfáticamente: "Quédate con un
$httpniño. Está bien".fuente
/user/:userIdo/thing. Una vez que se muda a,/users/roles/:roleIdentonces tiene que modificar la url y los parámetros de $ resource por verbo y podría estar usando $ http en ese momento.$resourcey cambiar a$httplugares. No puedo enfatizar lo suficiente cuánto desearía desear, desear nunca haber conocido$resource. Probablemente he perdido más de una semana persiguiendo los matices de los$resourceúltimos meses.$httpes tan fácil y directo, que cualquier ganancia que se pueda obtener$resourcefue completamente eliminada por la curva de aprendizaje.Creo que es importante enfatizar que $ resource espera un objeto o matriz como respuesta del servidor, no una cadena sin formato. Entonces, si tiene una cadena sin formato (o cualquier cosa, excepto el objeto y la matriz) como respuesta, debe usar $ http
fuente
Cuando se trata de elegir entre
$httpo$resourcetécnicamente hablando, no hay una respuesta correcta o incorrecta en esencia, ambos harán lo mismo.El propósito de
$resourcees permitirle pasar una cadena de plantilla (una cadena que contiene marcadores de posición) junto con los valores de los parámetros.$resourcereemplazará los marcadores de posición de la cadena de plantilla con los valores de los parámetros que se pasan como un objeto. Esto es principalmente útil cuando interactúa con la fuente de datos RESTFul, ya que utilizan principios similares para definir las URL.Lo que
$httphace es realizar las solicitudes HTTP asincrónicas.fuente
$resourceno se puede realizar de forma asincrónica? Solo quería aclarar$httpes la forma más simple de realizar solicitudes HTTP asincrónicas y lo que$resourceesencialmente hace lo mismo pero con diferentes parámetrosEl servicio de recursos es simplemente un servicio útil para trabajar con APSI 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.
fuente
$http.get('/path/to/thing', params)versusmyResource.get(params)más, realmente haciendo la configuración paramyResource. Más código por adelantado y solo funciona a la perfección con el mismo nombre API. De lo contrario, está codificando tanto como si usara $ http.Una cosa que noté al usar $ resource sobre $ http es si está utilizando API web en .net
$ resource está vinculado a un controlador que ejecuta un solo propósito.
$ resource ('/ user /: userId', {userId: '@ id'});
Mientras que $ http podría ser de cualquier cosa. solo especifica la url.
$ http.get - "api / authenticate"
Es solo mi opinión.
fuente
El servicio $ resource actualmente no admite promesas y, por lo tanto, tiene una interfaz claramente diferente al servicio $ http.
fuente
var myResource = $resource(...config...);en otro lugar del servicio que hacesreturn myResource.get(..params...)o puedes hacervar save = myResource.save(); save.$promise.then(...fn...); return save;