HttpClient e Envio de Requisições - Angular
Para interagir com o servidor e enviar requisições HTTP, o Angular utiliza a classe HttpClient
GET
POST
PUT
DELETE
HttpClient
XMLHttpRequest
Para usar essa classe no projeto, é necessário importar provideHttpClient
@angular/common/http
main.ts
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app/app.component';
import { provideHttpClient } from '@angular/common/http';
bootstrapApplication(AppComponent, { providers: [provideHttpClient()] }).catch(
(err) => console.error(err)
);
Vamos começar com a execução de uma requisição GET
helloapp/ ├── src/ │ ├── app/ │ │ ├── app.component.ts │ ├── main.ts │ ├── index.html ├── angular.json ├── package-lock.json ├── package.json └── tsconfig.json
Agora, faremos uma requisição a um arquivo JSON que conterá alguns dados. A pasta principal dos arquivos da aplicação é a src
assets
data.json
{
"name": "Bob",
"age": 28
}
Para representar esses dados, adicione um novo arquivo user.ts
export class User {
constructor(public name: string, public age: number) {}
}
A estrutura do projeto agora é a seguinte:
helloapp/ ├── src/ │ ├── app/ │ │ ├── app.component.ts │ │ ├── user.ts │ ├── assets/ │ │ ├── data.json │ ├── main.ts │ ├── index.html ├── angular.json ├── package-lock.json ├── package.json └── tsconfig.json
Agora, vamos definir o código no componente AppComponent
import { Component, OnInit } from "@angular/core";
import { HttpClient, HttpClientModule } from "@angular/common/http";
import { User } from "./user";
@Component({
selector: "my-app",
standalone: true,
imports: [HttpClientModule],
template: `<div>
<p>Nome do usuário: {{user?.name}}</p>
<p>Idade do usuário: {{user?.age}}</p>
</div>`
})
export class AppComponent implements OnInit {
user: User | undefined;
constructor(private http: HttpClient) {}
ngOnInit() {
this.http.get("assets/data.json").subscribe({
next: (data: any) => this.user = new User(data.name, data.age)
});
}
}
Neste exemplo, os dados do objeto User
ngOnInit()
OnInit
HttpClient
No método ngOnInit()
HttpClient
http.get()
Observable<Object>
Observable
subscribe
next
(data: any) => this.user = new User(data.name, data.age)
Como o arquivo JSON contém dados diretamente relacionados ao modelo da classe User
Já que o arquivo JSON é um arquivo auxiliar, precisamos informá-lo ao Angular CLI no arquivo angular.json
"assets": ["src/assets"]
{
"version": 1,
"projects": {
"helloapp": {
"projectType": "application",
"root": "",
"sourceRoot": "src",
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist/helloapp",
"index": "src/index.html",
"main": "src/main.ts",
"polyfills": ["zone.js"],
"tsConfig": "tsconfig.json",
"assets": ["src/assets"],
"aot": true
}
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"buildTarget": "helloapp:build"
}
}
}
}
}
}
Ao rodar o projeto, os dados carregados do arquivo data.json

Criando um Serviço
Ao interagir com o servidor, é comum que as requisições sejam feitas através de serviços auxiliares em vez de diretamente no componente. Isso ocorre porque um serviço pode encapsular a lógica de processamento dos dados recebidos, evitando sobrecarregar o código do componente. Além disso, os serviços podem fornecer funcionalidades que serão usadas por vários componentes. Assim, os componentes atuam como consumidores dos dados fornecidos pelos serviços.
Para trabalhar com requisições HTTP, adicione um novo arquivo http.service.ts
src/app
import { Injectable } from "@angular/core";
import { HttpClient } from "@angular/common/http";
@Injectable()
export class HttpService {
constructor(private http: HttpClient) { }
getData() {
return this.http.get("assets/data.json");
}
}
Nesse caso, o serviço recebe um objeto HttpClient
@Injectable
Para realizar uma requisição GET
get()
HttpClient
Agora, vamos utilizar o serviço no componente AppComponent
import { Component, OnInit } from '@angular/core';
import { HttpService } from './http.service';
import { User } from './user';
@Component({
selector: 'my-app',
standalone: true,
imports: [],
template: `<div>
<p>Nome do usuário: {{ user.name }}</p>
<p>Idade do usuário: {{ user.age }}</p>
</div>`,
providers: [HttpService],
})
export class AppComponent implements OnInit {
user: User;
constructor(private httpService: HttpService) {}
ngOnInit() {
this.httpService.getData().subscribe({
next: (data: any) => (this.user = new User(data.name, data.age)),
});
}
}
O serviço HttpService
AppComponent
getData()
subscribe()
Carregando Dados Complexos
Nos exemplos anteriores, os dados no arquivo JSON correspondiam diretamente à definição da classe User
this.user = new User(data.name, data.age)
data.json
{
"userList": [
{ "name": "Bob", "age": 28 },
{ "name": "Tom", "age": 45 },
{ "name": "Alice", "age": 32 }
]
}
O código do http.service.ts
Agora, vamos modificar o componente para lidar com uma lista de usuários:
import { Component, OnInit } from '@angular/core';
import { HttpService } from './http.service';
import { User } from './user';
@Component({
selector: 'my-app',
standalone: true,
imports: [],
template: `<ul>
@for(user of users; track $index){
<li>
<p>Nome do usuário: {{ user?.name }}</p>
<p>Idade do usuário: {{ user?.age }}</p>
</li>
}
</ul>`,
providers: [HttpService],
})
export class AppComponent implements OnInit {
users: User[] = [];
constructor(private httpService: HttpService) {}
ngOnInit() {
this.httpService.getData().subscribe({
next: (data: any) => (this.users = data['userList']),
});
}
}
Neste exemplo, queremos obter um array de objetos User
data.json
"userList"
users
this.users = data["userList"];
Agora, o componente exibirá a lista de usuários carregados do arquivo data.json
