AngularJS $ http e $ resource

Eu tenho alguns serviços da web que quero chamar. $resource ou $http , qual devo usar?

$resource : https://docs.angularjs.org/api/ngResource/service/$resource

$http : https://docs.angularjs.org/api/ng/service/$http

Depois de ler as duas páginas da API acima, estou perdido.

Poderia, por favor, explicar-me em inglês claro qual é a diferença e em que situação devo usá-los? Como faço para estruturar essas chamadas e ler os resultados em objects js corretamente?

$http é para AJAX de propósito geral. Na maioria dos casos, isso é o que você estará usando. Com $http você estará fazendo as chamadas do tipo GET , POST , DELETE manualmente e processando os objects que eles retornam por conta própria.

$resource envolve $http para uso em cenários de API da web RESTful.


Falando VERY geralmente: Um serviço web RESTful será um serviço com um endpoint para um tipo de dados que faz coisas diferentes com esse tipo de dados baseado em methods HTTP como GET , POST , PUT , DELETE , etc. Então, com um $resource , você pode chame um GET para obter o recurso como um object JavaScript, altere-o e envie-o de volta com um POST ou mesmo exclua-o com DELETE .

… se isso faz sentido.

Eu sinto que outras respostas, embora corretas, não explicam bem a raiz da questão: REST é um subconjunto do HTTP . Isso significa que tudo que pode ser feito via REST pode ser feito via HTTP mas nem tudo que pode ser feito via HTTP pode ser feito via REST . É por isso que $resource usa $http internamente.

Então, quando usar um ao outro?

Se tudo que você precisa é REST , ou seja, você está tentando acessar um serviço Web RESTful , o $resource vai tornar super fácil a interação com esse webservice.

Se, em vez disso, você estiver tentando acessar QUALQUER COISA que não seja um serviço da web RESTful , você terá que usar o $http . Tenha em mente que você também pode acessar um serviço web RESTful via $http , ele será muito mais complicado do que com $resource . É assim que a maioria das pessoas vem fazendo isso fora do AngularJS, usando o jQuery.ajax (equivalente ao $http do Angular).

$http faz chamada AJAX de propósito geral, na qual geral significa que pode include API RESTful e API não RESTful .

e $resource é especializado para essa parte RESTful .

Restful Api veio a prevalente nos últimos anos, porque o URL é melhor organizado em vez de URL aleatória composta por programadores.

Se eu usar uma API RESTful para construir o URL, seria algo como /api/cars/:carId .

$resource maneira de $resource para buscar dados

 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'); }]); 

Isso lhe dará um object de recurso , que é acompanhado com os methods get , save , query , remove , delete automaticamente.

$http maneira de buscar dados

 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... } 

Veja como precisamos definir cada operação comum na API RESTFul . Também uma diferença é que $http retorna a promise enquanto $resource retorna um object. Existem também plugins de terceiros para ajudar o Angular a lidar com a API RESTFul, como o restangular


Se a API é algo como /api/getcarsinfo . Tudo o que resta para nós é usar $http .

Acho que a resposta depende mais de quem você é no momento em que você está escrevendo o código. Use $http se você for novo no Angular, até saber por que precisa de $resource . Até que você tenha uma experiência concreta de como o $http está prendendo você, e você entende as implicações de usar $resource em seu código , fique com $http .

Essa foi a minha experiência: eu iniciei meu primeiro projeto Angular, precisei fazer solicitações HTTP para uma interface RESTful, então fiz a mesma pesquisa que você está fazendo agora. Com base na discussão que li em perguntas do SO como essa, optei por usar $resource . Este foi um erro que eu gostaria de poder desfazer. Aqui está o porquê:

  1. $http exemplos são abundantes, úteis e geralmente apenas o que você precisa. Limpar exemplos de $resource são escassos e (na minha experiência) raramente tudo que você precisa. Para o novato angular, você não vai perceber as implicações de sua escolha até mais tarde, quando você estiver confuso sobre a documentação e com raiva que você não pode encontrar exemplos úteis de $resource para ajudá-lo.
  2. $http é provavelmente um mapa mental de 1 para 1 do que você está procurando. Você não precisa aprender um novo conceito para entender o que recebe com $http . $resource traz muitas nuances que você ainda não tem um mapa mental.
  3. Oops, eu disse que você não precisa aprender um novo conceito? Como um novato Angular você tem que aprender sobre promises. $http retorna uma promise e é, então, capaz de se adequar às novas coisas que você está aprendendo sobre Angular e promises. $resource , que não retorna uma promise diretamente, dificulta sua compreensão hesitante dos fundamentos angulares.
  4. $resource é poderoso porque condensa o código para chamadas RESTful CRUD e as transformações para input e saída. Isso é ótimo se você está cansado de escrever código repetidamente para processar os resultados de $http . Para qualquer outra pessoa, $resource adiciona uma camada enigmática de syntax e passagem de parâmetros que é confusa.

Eu gostaria de ter me conhecido há 3 meses, e estaria me dizendo enfaticamente: “Fique com o garoto do $http . Está tudo bem”.

Eu acho que é importante enfatizar que $ resource espera object ou array como resposta do servidor, não string raw. Então, se você tem uma string raw (ou qualquer coisa, exceto object e array) como resposta, você tem que usar $ http

Quando se trata de escolher entre $http ou $resource tecnicamente falando, não há resposta certa ou errada, em essência, ambos farão o mesmo.

O objective do $resource é permitir que você passe uma string de modelo (uma string que contém espaços reservados) junto com os valores dos parâmetros. $resource irá replace os placeholders da string do template com os valores dos parâmetros sendo passados ​​como um object. Isso é útil principalmente ao interagir com a fonte de dados RESTFul, pois eles usam princípios semelhantes para definir as URLs.

O que $http faz é executar as solicitações HTTP assíncronas.

O serviço de resources é apenas um serviço útil para trabalhar com RPS APSIs. quando você o usa, você não escreve seus methods CRUD (criar, ler, atualizar e excluir)

Tanto quanto eu vejo, o serviço de resources é apenas um atalho, você pode fazer qualquer coisa com o serviço http.

Uma coisa que notei ao usar $ resource sobre $ http é se você está usando uma API da Web em .net

$ resource é amarrado em um controlador que executa uma única finalidade.

$ 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) { } 

Enquanto $ http poderia ser de qualquer coisa. basta especificar o URL.

$ http.get – “api / autenticar”

 [HttpGet] public bool Authenticate(string email, string password) { return _authenticationService.LogIn(email, password, false); } 

é só minha opinião.

O serviço de resources $ atualmente não suporta promises e, portanto, possui uma interface diferente para o serviço $ http.