Angular HTTP: Como realizar requisições em suas aplicações

Neste artigo veremos como utilizar a classe HttpClient do Angular para realizar diferentes tipos de requisições HTTP.

Realizar requisições HTTP é uma das tarefas mais comuns em SPAs atualmente. É por meio delas que a aplicação se comunica com APIs RESTful que lhes provêem dados e funcionalidades. Portanto, saber realizar esse tipo de ação no Angular é fundamental para todo desenvolvedor que utiliza esse framework.

Atualmente, a maioria das aplicações do tipo SPA (Single Page Applications) se comunicam com algum serviço no back-end por meio do protocolo HTTP. A fim de consumir dados e funcionalidades expostos por esse serviço, que normalmente é uma API RESTful, a SPA envia requisições HTTP utilizando um dos seus diferentes verbos (GET, POST, PUT, DELETE etc.) e trata os seus possíveis resultados (200, 404, 500, etc.).

Para que possamos fazer esse tipo de requisição no JavaScript dispomos hoje de duas APIs suportadas pelos browsers modernos: XMLHttpRequest (mais antiga) e fetch (mais recente e que utiliza promises). E quando se trata de um projeto Angular, contamos com um mecanismo nativo desse framework que oferece uma interface simplificada para realizar essa tarefa, mas que internamente utiliza o XMLHttpRequest. Trata-se da classe HttpClient, disponível no módulo HttpClientModule.

Neste artigo veremos como utilizar essa classe para realizar diferentes tipos de request, bem como aprenderemos a tratar seus retornos e erros.

Conhecendo a API RESTful

Para fins de demonstração das requisições HTTP, utilizaremos uma API RESTful desenvolvida em Node.js com o framework Express. Essa API vai expor alguns endpoints para a manutenção de um cadastro de produtos (dados fixos), de acordo com a seguinte especificação da Tabela 1.

Endpoint Verbo Objetivo Retornos possíveis
/produtos GET Retorna todos os produtos. 200 sempre
/produtos/id GET Retorna um produto pelo id. 200 para sucesso 404 para id inexistente
/produtos POST Cadastra novo produto. 201 para sucesso 400 para erro de validação
/produtos/id PUT Atualiza um produto. 204 para sucesso 400 para erro de validação 404 para id inexistente
/produtos/id DELETE Exclui um produto pelo id. 204 para sucesso 404 para id inexistente

Observação: os dados são trafegados no formato JSON.

Primeiros passos

Para usar a classe HttpClient, primeiramente precisamos importar o módulo HttpClientModule no módulo em que se encontra declarado o componente/serviço em que vamos realizar as requisições. Aqui vamos realizar as requisições no próprio AppComponent, que é criado por padrão quando iniciamos um novo projeto Angular. Portanto, precisamos importar o módulo HttpClientModule no app.module.ts, da mesma forma que apresentada na Listagem 1.

import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { AppComponent } from './app.component'; import { HttpClientModule } from '@angular/common/http'; @NgModule({ declarations: [ AppComponent ], imports: [ BrowserModule, HttpClientModule ], providers: [], bootstrap: [AppComponent] }) export class AppModule { }
Listagem 1. app.module.ts

Feito isso, podemos abrir o app.component.ts e declarar no construtor da classe um parâmetro do tipo HttpClient. Note no código abaixo que usaremos o modificador private para que esse parâmetro seja automaticamente uma propriedade do componente, de forma que possamos usá-lo em seguida usando a sintaxe this.http.

constructor(private http : HttpClient) {}

Como usamos o modificador private já no parâmetro, não precisamos atribuí-lo a nenhum objeto internamente. O Angular será capaz de injetar uma instância da classe HttpClient dinamicamente. Assim sendo, não precisamos usar o operador new para instanciar o objeto local http.

Configurando a interface do componente

Sabendo que temos cinco 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 da Listagem 2.

<button (click)="listarTodosProdutos()">GET</button> <button (click)="listarProdutoPorId()">GET /id</button> <button (click)="adicionarProduto()">POST</button> <button (click)="alterarProduto()">PUT</button> <button (click)="excluirProduto()">DELETE</button>
Listagem 2. app.component.html

Cada botão tem seu evento onclick vinculado a um método que criaremos a partir de agora.

Enviando requisições HTTP

Começaremos essa seção declarando uma variável no componente contendo o endereço da API. Ele será usado para que não precisemos repetir o endereço completo em cada requisição, bem como para facilitar sua alteração caso seja necessário:

readonly apiURL : string;

A variável foi declarada como readonly, pois ela não deve ser alterada em nenhum outro ponto do código após ser inicializada, o que será feito no construtor da classe:

constructor() { this.apiURL == 'http://localhost:3000'; }

Em seguida, a primeira requisição que enviaremos será do tipo GET para listar todos os produtos, então vamos codificar o método listarTodosProdutos conforme a Listagem 3.

listarTodosProdutos() { this.http.get(`${ this.apiURL }/produtos`) .subscribe(resultado => console.log(resultado)); }
Listagem 3. listarTodosProdutos

Artigos relacionados