Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Separação de "services" e "resources" no Angular 2.

No Angular 1, utilizávamos uma feature apenas para os 'services' e outra feature apenas para os 'resources', vide exemplos a seguir.

Exemplo de service:

;(function(ng) {
  'use strict';

  ng.module('my-app')
    .service('$servicoPadrao', [
      function servicoPadraoFn() {
        let self = this;
        let urlBase = 'http://whatever/v2/API/Consulta/ServicoConsulta.svc/';

        self.gerarURL = function(endpoint) {
          return urlBase + endpoint;
        };

        self.obterHeaders = function(){
          var _headers = {
            'Content-Type': 'application/json',
            'CodigoCliente': 108715,
            'Modulo': 'nHYnnmJUbyfdVCrxv==',
            'Autorizacao': 'Basic cg97BNnHgTtdTfvjbgDDcGHvgd=='
          };

          return _headers;
        };

        return self;
      }
    ]);
}(window.angular));

Exemplo de resource:

;(function(ng) {
  'use strict';

  ng.module('my-app')
    .factory('$dashboardResource', [
      '$resource',
      '$servicoPadrao',
      function($resource, $servicoPadrao) {
        const _url = $servicoPadrao.gerarURL(':acao/:id');
        const _params = {
          id: '@id',
          acao: '@acao'
        };
        const _method = {

          consultarTotalVendido: {
            method: 'GET',
            headers: $servicoPadrao.obterHeaders(),
            params: {
              acao: 'consultarTotalVendido',
              inicioPeriodo: '@inicioPeriodo',
              fimPeriodo: '@fimPeriodo'
            },
            isArray: false,
          }

        return $resource(_url, _params, _method);
      }
    ]);
}(window.angular));

Com o Angular 2, no arquivo *.ts eu tenho o serviço através do "import { Http }..." conforme foi mostrado na aula, correto?

É um padrão ter services e resources no mesmo arquivo ou seria uma boa prática separá-los conforme fazíamos no Angular 1?

Além disso: - Como fazer para obter no "html.get..." os headers, params, etc, quando dependem de autorização? - Qual seria a melhor forma de ter o mesmo funcionamento acima (ou melhorá-lo)? - Que estrutura de pastas/arquivos seguir p/ otimizar o desempenho e facilitar a manutenção do código?

3 respostas
solução!

Em Angular 1.X, uma factory retorna um objeto enquanto um service uma construction function. Inclusive na documentação do Angular 1.X a equipe pede para dar primazia pela factory do que pelo service (desencorajam o seu uso) justamente por retornar uma função construtora que ao ser chamada cria uma nova instância do serviço. Em Angular 1.X você pode centralizar o acesso à sua API em um resource. Porém, ele meio que perdeu a força porque hoje não é raro SPA's não consumirem REST, por exemplo, consumirem um esquema do GraphQL e por ai vai.

Então, no Angular 2/4/5, service, factory e resource é tudo considerado service que nada mais é do que uma classe anotada com @Injectable(). Cada service no Angular fica no seu próprio arquivo, ok? Isso adere ao SRP (single responsability principle).

Para obter acesso ao header você acessa diretamente o response (a resposta) vinda do servidor.

A partir do Angular 4 foi introduzido o HttpClient que substituiu o Http. Ele possui interceptadores iguais aos que existem no Angular 1.X. Nesse sentido, você pode criar interceptadores para capturar token, reenviar. Isso ajudou bastante quem veio do Angular 1.X.

Angular 4 também introduziu guardas de rotas. Uma configuração especial que você pode acionar antes das rotas da aplicação serem acionadas (para proteger).

Segue um post para lhe dar uma ideia global sobre autenticação com guarda de rotas.

https://medium.com/@ryanchenkie_40935/angular-authentication-using-route-guards-bf7a4ca13ae3

Aliás, esse é um bom momento de pedir uma atualização do curso aqui:

https://trello.com/b/4grNfK1m/alura-alunos-cursos

Sucesso e bom estudo!

Obrigada Flavio! Já fiz minha votação!

Obrigado! Quanto mais votos, mais chances do curso ser atualizado :)

A Alura foi pioneira no curso de Angular 2, lançamos praticamente com o lançamento mundial do framework. De lá pra cá, ele veio sofrendo mudanças, tudo através do feedback da comunidade.