Executando verificação de segurança...
1

Como fazer requisições Http no Angular usando a classe HttpClient ?

Angular HttpClient tutorial; No Angular, usamos a API HttpClient para lidar com as solicitações HTTP. Neste tutorial, você aprenderá como acionar solicitações HTTP em Angular usando a API HttpClient.

Para começar, é preciso importar o módulo HTTPClientModule no módulo principal da aplicação. Em seguida, é preciso injetá-lo em um componente ou serviço através do construtor, como mostrado abaixo:

import { HttpClient } from '@angular/common/http';

@Component({
  // ... outras configurações
})
export class MeuComponente {
  constructor(private http: HttpClient) {}
}

Agora, já podemos começar a fazer requisições HTTP usando o objeto http. Vamos ver alguns exemplos de como podemos utilizá-lo.

GET

Para fazer uma requisição GET, basta chamar o método get passando a URL como parâmetro:

listarTodosProdutos() {
this.http.get('http://minha-api.com/recursos').subscribe(
  (dados) => {
    console.log(dados);
  },
  (erro) => {
    console.error(erro);
  }
);
}

O método get retorna um objeto do tipo Observable, que permite a inscrição em eventos de sucesso ou falha da requisição. No exemplo acima, estamos inscrevendo-nos em ambos os eventos, passando uma função para ser chamada quando a requisição for bem-sucedida (dados são recebidos) e outra para ser chamada quando houver um erro.

POST

Para fazer uma requisição POST, basta chamar o método post passando a URL e o corpo da requisição como parâmetros:

const produto = {
  nome: 'caneta',
  quantdade: 30
};

adicionarProduto(){
this.http.post('http://minha-api.com/recursos', produto).subscribe(
  (dados) => {
    console.log(dados);
  },
  (erro) => {
    console.error(erro);
  }
);
}

PUT e DELETE

Para fazer uma requisição PUT ou DELETE, basta seguir a mesma lógica, chamando os métodos put ou delete respectivamente:

// PUT
const produto = {
  nome: 'caneta',
  quantdade: 30
};
alterarProduto(){
this.http.put('http://minha-api.com/recursos/1', produto).subscribe(
  (dados) => {
    console.log(dados);
  },
  (erro) => {
    console.error(erro);
  }
);
}

DELETE

// DELETE
excluirProduto(){
this.http.delete('http://minha-api.com/recursos/1').subscribe(
  (dados) => {
    console.log(dados);
  },
  (erro) => {
    console.error(erro);
  }
);
}

Configurando a interface do componente

Sabendo que temos 4 tipos de requisições possíveis na API, vamos adicionar a mesma quantidade de botões no AppComponent, um para cada request. Para isso, apagaremos todo o conteúdo do app.component.html e adicionaremos o código abaixo:

<button (click)="listarTodosProdutos()">GET</button>
<button (click)="adicionarProduto()">POST</button>
<button (click)="alterarProduto()">PUT</button>
<button (click)="excluirProduto()">DELETE</button>

Tratamento de erros

É comum querer tratar erros de maneira mais específica em cada requisição, e para isso o HTTPClient fornece o método handleError, que pode ser usado da seguinte maneira:

import { HttpErrorResponse } from '@angular/common/http';

private tratarErro(erro: HttpErrorResponse) {
  if (erro.error instanceof ErrorEvent) {
    //// Ocorreu um erro do lado do cliente ou da rede. Trate-o de acordo.
    console.error('Ocorreu um erro:', erro.error.message);
  } else {
    // O back-end retornou um código de resposta malsucedido.
    // O corpo da resposta pode conter pistas sobre o que deu errado,
    console.error(
      `Backend returnou um código de ${erro.status}, ` + `body was: ${erro.error}`
    );
  }
  // retornar um observável com uma mensagem de erro voltada para o usuário
  return throwError('Algo ruím aconteceu; por favor, tente novamente mais tarde.');
};

this.http.get('http://minha-api.com/recursos').subscribe(
  (dados) => {
    console.log(dados);
  },
  (erro) => this.tratarErro(erro)
);

Requisições tipadas

Projetos Angular usam a linguagem TypeScript por padrão, o que nos permite desfrutar dos recursos que essa linguagem oferece. Entre eles está a tipagem estática, que é a possibilidade de fixar o tipo de uma variável no momento da sua declaração.

Uma das possíveis aplicações para esse recurso é na definição das classes que representam os dados/entidades da nossa aplicação. Por exemplo, seguindo a ideia que desenvolvemos anteriormente, podemos criar uma classe Produto representando esse tipo que trafega entre a SPA e a API (e que possivelmente seria vinculado a inputs, por exemplo, para exibição e captura de dados em um projeto real).

Fazendo isso, podemos tipar também o retorno das requisições HTTP, de forma que nós, ou quem precisar manter nosso código, saberemos o que esperar como resultado de cada request.

Para exemplificar, vamos criar uma classe chamada Produto. Para isso adicionaremos uma pasta models e dentro dela o arquivo produto.model.ts ao projeto contendo o seguinte código:

export class Produto {
    id : number;
    nome : string;
}

Em seguida, importaremos esse tipo no AppComponent para que possamos usá-lo nas requisições:

import { Produto } from './models/produto.model';

Feito isso, podemos agora especificar o tipo de retorno das requisições GET. No caso do método listarTodosProdutos, o tipo de retorno será Produto[ ], ou seja, um array de produtos. Já no listarProdutoPorId o tipo é apenas Produto, posto que apenas um item é retornado.Abaixo vemos como fica a requisição GET:

listarTodosProdutos() {
  this.http.get<Produto[]>(`${ this.apiURL }/produtos`)
            .subscribe(resultado => console.log(resultado));
}

Ao fazer isso, também contamos com um auxílio a mais do editor, que passa a mostrar o tipo do resultado.
Já na requisição POST podemos especificar o tipo tanto no corpo da requisição, quanto na resposta, assim como mostra a seguir:

adicionarProduto() {
  var produto = new Produto();
  produto.nome = "Cadeira Gamer";

  this.http.post<Produto>(`${ this.apiURL }/produtos`, produto)
  //restante do código sem alterações
}

O mesmo ocorre com a requisição PUT, porém como seu retorno esperado é 204 (No Content), ela não deve ser tipada como Produto, pois o corpo da resposta virá vazio.

Assim finalizamos este conteúdo sabendo realizar diferentes tipos de requisição HTTP no Angular, seja com objetos dinâmicos ou tipados.

Carregando publicação patrocinada...