AngularJS $ http e $ resource

257

Eu tenho alguns serviços da web que desejo chamar. $resourceou $httpqual deles 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 acima da API, estou perdido.

Poderia me explicar em inglês simples qual é a diferença e em que situação devo usá-las? Como estruturar essas chamadas e ler os resultados em objetos js corretamente?

Tom
fonte
25
O recurso $ é construído sobre $ http e fornece mais abstração das comunicações subjacentes. Também requer um ponto final REST que esteja em conformidade com os padrões de recursos $. Como você está perguntando, minha sugestão é começar com $ http, familiarizar-se e depois ver se você pode mudar para $ resource.
David Riccitelli
4
Obrigado pela resposta. Então, em que situação o $ http é preferido sobre o $ resource, além do que eu posso familiarizar com a API?
Tom

Respostas:

168

$httpé para uso geral AJAX. Na maioria dos casos, é isso que você usará. Com $httpvocê vai estar fazendo GET, POST, DELETEtipo chama manualmente e processar os objetos que o retorno sobre o seu próprio.

$resourceWraps $httppara uso em cenários de API da web RESTful.


Falando muito em geral: web service A RESTful será um serviço com um ponto de extremidade para um tipo de dados que faz coisas diferentes com esse tipo de dados com base em HTTP métodos como GET, POST, PUT, DELETE, etc. Assim, com um $resource, você pode chamar um GETpara obter o recurso como um objeto JavaScript, altere-o e envie-o de volta com a POST, ou mesmo exclua-o com DELETE.

... se isso faz sentido.

Ben Lesh
fonte
1
Portanto, $ resource lida com serviços Restful, isso significa que também pode ser usado para chamar serviços Web normais? Uma vez que obtém POST DELETE, coloque tudo isso. Então, em que situação $ http é preferível a $ resource?
Tom
7
Realmente, a qualquer momento, você não está lidando com um endpoint verdadeiramente repousante. Ele adiciona muitas funcionalidades que você não precisaria se seu ponto de extremidade permitisse apenas GET, por exemplo.
precisa
@blesh, portanto, usando o $resourceserviço só seria idiomática / bom se suas sustentações terminal REST GET, POST, e DELETE ? Os documentos ( docs.angularjs.org/api/ngResource.$resource ) mostram que você obtém esses três métodos REST $resource.
Kevin Meredith
9
@ KevinMeredith: Ou qualquer número de métodos. Você pode adicionar PUTou qualquer outra coisa que desejar GET, POSTe DELETEsão apenas padrões. Se você possui um terminal que lida com o mesmo recurso (isso é importante) para mais de um método HTTP, $resourceé uma boa opção.
precisa saber é o seguinte
Mesmo para um terminal sem RESTful, achei conveniente usar $ resource para dados do tipo GET e QUERY. Dada a maneira como .$promisefunciona bem resolvepara roteamento e ligação.
Kevin
210

Eu sinto que outras respostas, embora corretas, não explicam bem a raiz da pergunta: RESTé um subconjunto de HTTP. Isso significa que tudo o que pode ser feito via RESTpode ser feito via, HTTPmas nem tudo o que pode ser feito via HTTPpode ser feito via REST. É por isso que $resourceusa $httpinternamente.

Então, quando usar um ao outro?

Se tudo o que você precisa é REST, você está tentando acessar um serviço da RESTfulweb,$resource isso facilita a interação com esse serviço da Web.

Se, em vez disso, você estiver tentando acessar QUALQUER COISA que não seja um serviço da RESTfulWeb, precisará seguir com isso $http. Lembre-se de que você também pode acessar um serviço da RESTfulWeb via $http, ele será muito mais complicado do que com ele $resource. É assim que a maioria das pessoas faz fora do AngularJS, usando jQuery.ajax(equivalente ao Angular $http).

bluehallu
fonte
21
resposta agradável, este deve ser aceita, não a um em cima
Andrzej Rehmann
2
Isso significa que temos três maneiras de chamar RESTful ?? Usando $ resource, $ http e jquery.ajax, estou certo?
Jake Huang
4
@JakeHuang Você pode chamá-lo mesmo sem nenhuma biblioteca, existem infinitas maneiras de fazê-lo. Acabei de expor as duas abordagens mais populares no mundo do AngularJS e a abordagem mais comum fora dele.
bluehallu
Posso saber quais são as duas abordagens mais populares no AngularJS? : p
Jake Huang
41

$httpfaz uma chamada AJAX de uso geral, na qual geral significa que pode incluir API RESTful mais API não RESTful .

e $resourceé especializado para essa parte RESTful .

Restful Api veio a prevalecer nos últimos anos porque o URL é melhor organizado em vez do URL aleatório composto pelos programadores.

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

$resource maneira de 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');

    }]);

Isto lhe dará um objeto de recurso , que é acompanhado com get, save, query, remove, deletemétodos 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 $httpretorna promiseenquanto $resourceretorna um objeto. Também existem plugins de terceiros para ajudar o Angular a lidar com a API RESTFul como restangular


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

Qiang
fonte
4
Este deve ser o respondedor.
Royi Namir 01/12/2015
1
Se a API é /api/getcarsinfoque eu acho que nós ainda pode usar$resource
Kittu
1
Este deve ser o respondedor. quando você disse "Também uma diferença é que $ http retorna promessa enquanto $ resource retorna um objeto" 1- isso significa que eu não preciso usar. então com $ resource? 2- também como pessoa de front-end e isso pode parecer bobagem, como posso descobrir se a API é tranquila ou não? graças
Khatab shireef
1
@shireefkhatab 1. Sim, $ resource é apenas uma abstração de nível mais alto de $ http para a conectividade da API RESTFul. O exemplo do documento mostra como usá-lo. 2. Depende totalmente de como o seu back-end cria o URL. Se ele quer se conformar com o paradigma RESTFul api, então você está pronto para ir #
Qiang
30

Acho que a resposta depende mais de quem você é no momento em que está escrevendo o código. Use $httpse você é novo na Angular, até saber por que precisa $resource. Até que você tenha uma experiência concreta de como o $httpestá impedindo e compreenda as implicações do uso $resourceno seu código , fique com ele $http.

Esta foi a minha experiência: iniciei meu primeiro projeto Angular, precisava 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 como essa, escolhi seguir em frente $resource. Foi um erro que eu gostaria de desfazer. Aqui está o porquê:

  1. $httpexemplos são abundantes, úteis e geralmente exatamente o que você precisa. $resourceExemplos claros são escassos e (na minha experiência) raramente tudo o que você precisa. Para o novato no Angular, você não perceberá as implicações de sua escolha até mais tarde, quando estiver confuso com a documentação e com raiva por não encontrar $resourceexemplos úteis para ajudá-lo.
  2. $httpé provavelmente um mapa mental 1 para 1 do que você está procurando. Você não precisa aprender um novo conceito para entender com o que se relaciona $http.$resourcetraz muitas nuances para as quais você ainda não tem um mapa mental.
  3. Opa, eu disse que você não precisa aprender um novo conceito? Como um novato Angular você não tem que aprender sobre promessas. $httpretorna uma promessa e é .thencapaz, por isso se encaixa perfeitamente nas novas coisas que você está aprendendo sobre a Angular e as promessas. $resource, que não retorna uma promessa diretamente, complica sua tentativa de entender os fundamentos angulares.
  4. $resourceé poderoso porque condensa o código para chamadas RESTful CRUD e as transformações para entrada e saída. Isso é ótimo se você está cansado de escrever código repetidamente para processar os resultados $http. Para qualquer outra pessoa, $resourceadiciona uma camada enigmática de sintaxe e passagem de parâmetro que é confusa.

Eu gostaria de me conhecer há três meses e estaria enfaticamente dizendo a mim mesma: "Fique com a $httpcriança. Está tudo bem".

Matthew Marichiba
fonte
1
Eu gosto da sua resposta, especialmente da última linha. Atualmente, estou passando por uma mudança no uso de $ resource vs $ http. A única coisa que eu também acrescentaria é que $ resource realmente é realmente útil e realmente ajuda quando você está usando o mesmo substantivo da API , como /user/:userIdou /thing. Depois de mudar para /users/roles/:roleId, você precisará modificar o URL e os parâmetros $ resource por base de verbo e poderá usar o $ http nesse momento.
coblr
3
Me chame de esquizofrênico por comentar minha própria resposta, mas pensei em mencionar experiências mais recentes. Eu tenho refatorado para eliminar $resourcee mudar para alguns $httplugares. Não posso enfatizar o suficiente o quanto gostaria de desejar nunca ter conhecido $resource. Provavelmente perdi mais de uma semana perseguindo as nuances de $resourcemais de um mês. $httpé tão fácil e direto que qualquer ganho a ser obtido $resourcefoi completamente eliminado pela curva de aprendizado.
Matthew Marichiba 15/03
24

Eu acho que é importante enfatizar que $ resource espera objeto ou array como resposta do servidor, não como string não processada. Portanto, se você tiver uma sequência bruta (ou qualquer coisa, exceto objeto e matriz) como resposta, precisará usar $ http

sparrkli
fonte
Isso significa que $ http não suporta objeto e matriz? Só queria esclarecer.
Shardul 6/08/2015
Acredito $ http suporta objetos, matrizes e strings - Eu precisaria de confirmação sobre isso embora
Katana24
@Shardul, eu entendi que $ http lida com qualquer tipo de resposta, mas $ resource lida apenas com objetos e matrizes.
Khatab shireef
Não é verdade, você ainda pode usar $ resource para retornar uma String. Use 'transformResponse' no seu código de front-end para agrupar a String retornada em um objeto.
Terry Deng
7

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

O objetivo de $resourceé permitir que você passe uma sequência de modelo (uma sequência que contém espaços reservados) junto com os valores dos parâmetros. $resourcesubstituirá os espaços reservados da string de modelo pelos valores dos parâmetros que estão sendo passados ​​como um objeto. Isso é útil principalmente ao interagir com a fonte de dados RESTFul, pois eles usam princípios semelhantes para definir os URLs.

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

Dalorzo
fonte
1
Essa é uma boa resposta, pois aponta que $ http é o que alimenta as solicitações do $ resource e que essencialmente fazem a mesma coisa.
coblr
@ Dalorzo Então você quer dizer $resourceque não pode executar de forma assíncrona? Apenas queria esclarecer
Kittu
Não, o que eu ressaltado é que no final $httpé a maneira mais simples de executar um assíncrono solicitações HTTP eo que $resourcefaz essencialmente a mesma, mas com parâmetros diferentes
Dalorzo
2

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

Na minha opinião, o serviço de recursos é apenas um atalho, você pode fazer qualquer coisa com o serviço http.

john Smith
fonte
Não tenho certeza se classificaria $ resource como um atalho. É um invólucro por $ http, portanto, usar $ http diretamente seria "mais curto". É uma maneira de configurar o $ http para que você tenha potencialmente menos código ao utilizar o $ http. Em um caso $http.get('/path/to/thing', params)versus versus myResource.get(params)realmente fazendo a configuração para myResource. Mais código na frente e realmente funciona muito bem com o mesmo substantivo da API. Caso contrário, você está codificando tanto quanto se usasse $ http.
coblr
2

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

O recurso $ está vinculado a 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 pode ser de qualquer coisa. basta especificar o URL.

$ http.get - "API / autenticação"

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

é apenas a minha opinião.

jayson.centeno
fonte
0

O serviço de recursos $ atualmente não suporta promessas e, portanto, possui uma interface distintamente diferente do serviço $ http.

firdous
fonte
1
O serviço de recursos $ suporta promessas, mas não retorna uma promessa diretamente como $ http. Você tem que fazê-lo como var myResource = $resource(...config...);, em seguida, em outro lugar no serviço que você faz return myResource.get(..params...)ou você pode fazêvar save = myResource.save(); save.$promise.then(...fn...); return save;
coblr