Vous êtes sur la page 1sur 34

Angular : requête HTTP

Achref El Mouelhi

Docteur de l’université d’Aix-Marseille


Chercheur en programmation par contrainte (IA)
Ingénieur en génie logiciel

elmouelhi.achref@gmail.com

H & H: Research and Training 1 / 29


Plan

1 Introduction

2 Installation d’un serveur

3 Fonctionnement

4 Exemple

5 Fichiers environment

H & H: Research and Training 2 / 29


Introduction

Angular
Le protocole HTTP

Hypertext Transfer Protocol

Protocole de communication entre client et serveur

H I ©
Basé sur la notion requête - réponse appelée généralement (HTTP Request -
HTTP Response)
U EL
O
f E LM
Plusieurs types de requêtes = méthodes HTTP

GET
ch r e
POST
©A
DELETE
PUT

Toutes ces méthodes prennent en paramètre l’adresse du serveur ( + pour


certaines méthodes les données à manipuler)

H & H: Research and Training 3 / 29


Introduction

Angular

RESTful, REST et HTTP, c’est quoi le lien ?

H I ©
Le Web et l’API REST sont basés sur le protocole HTTP
(architecture client/serveur)
U EL
RESTful est juste un adjectifL M O
qui désigne une API REST.
f E
re des méthodes comme get, post,
c h
L’API REST utilise donc
© A l’échange de données entre client et serveur (Un
delete... pour
client envoie une requête, et le serveur retourne une réponse)

H & H: Research and Training 4 / 29


Introduction

Angular
Angular et les serveurs

Angular est un Framework JavaScript qui permet de réaliser des applications


web qui s’exécutent coté client

H I ©
Angular possède un module, HttpModule (HttpClientModule depuis la

EL
version 5) facilitant la réalisation de requête HTTP vers n’importe quel serveur
via les classes suivantes :
O U
HttpClient
f E LM
HttpHeaders
ch r e
© A
HttpInterceptor
HttpRequest
...

Pour le coté serveur : on peut utiliser un serveur JSON qui recevra des requêtes
HTTP envoyées par Angular et retourner une réponse

H & H: Research and Training 5 / 29


Installation d’un serveur

Angular

json-server

Un serveur Http de test, open-source, pour les développeurs


Front-End
H I ©
UEL
Documentation :
O
https://github.com/typicode/json-server
f E LM
ch r e
©A

H & H: Research and Training 6 / 29


Installation d’un serveur

Angular

json-server

Un serveur Http de test, open-source, pour les développeurs


Front-End
H I ©
UEL
Documentation :
O
https://github.com/typicode/json-server
f E LM
ch r e
© A
Pour l’installer
npm install -g json-server

H & H: Research and Training 6 / 29


Installation d’un serveur

Angular
Créons un fichier personnes.json qui va nous servir de base de
données et qui sera situé au même niveau que le dossier du notre
projet Angular8
{
"personnes": [
H I ©
EL
{
"nom": "wick",
O U
LM
"prenom": "john",

},
"id": 1
r e f E
ch
©A
{
"nom": "green",
"prenom": "bob",
"id": 2
}
]
}

H & H: Research and Training 7 / 29


Installation d’un serveur

Angular
Avant d’envoyer des requêtes HTTP au json-server

Utiliser la console pour se placer dans le répertoire contenant le


fichier personnes.json

H I ©
Démarrer json-server sur le port 5555 en précisant le nom de
notre base de données
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 8 / 29


Installation d’un serveur

Angular
Avant d’envoyer des requêtes HTTP au json-server

Utiliser la console pour se placer dans le répertoire contenant le


fichier personnes.json

H I ©
Démarrer json-server sur le port 5555 en précisant le nom de
notre base de données
UEL
O
f E LM
Lancer le serveur
ch r e
©A
json-server -p 5555 personnes.json

H & H: Research and Training 8 / 29


Installation d’un serveur

Angular
Avant d’envoyer des requêtes HTTP au json-server

Utiliser la console pour se placer dans le répertoire contenant le


fichier personnes.json

H I ©
Démarrer json-server sur le port 5555 en précisant le nom de
notre base de données
UEL
O
f E LM
Lancer le serveur
ch r e
©A
json-server -p 5555 personnes.json

Résultat (parmi toutes les lignes affichées)


Resources
http://localhost:5555/personnes
H & H: Research and Training 8 / 29
Installation d’un serveur

Angular

http://localhost:5555/personnes
H I ©
U ELréaliser des
C’est l’URL qui sera utilisée par le client pour
requêtes HTTP
L MO
r e f
Si on copie cette adresse Eet qu’on la colle dans le navigateur, on
A chdonnées de notre base de données
obtient toutes les
©

H & H: Research and Training 9 / 29


Fonctionnement

Angular
x.component.html
{{ }}
[]
()
[( )]
H I ©
U EL
O
f E LM
ch r
Requêtee
©A
HTTP
Http
Client

Réponse
HTTP x.service.ts x.component.ts
Serveur
Application Angular
H & H: Research and Training 10 / 29
Fonctionnement

Angular
Explication

Les données sont saisies (ou affichées) dans le template


.component.html

H I ©
La classe .component.ts peut récupérer des données dont la
EL
source est le template .component.html pour les passer au
U
O
LM
service ou récupérer des données dont la source est le service

r e f E
pour les passer au template .component.html.
En faisant une c
A h de dépendance du service .service.ts
injection
©
dans .component.ts, ce dernier peut l’utiliser pour persister ou
récupérer des données
En faisant une injection de dépendance de la classe HttpClient
dans .service.ts, ce dernier peut effectuer des requêtes
HTTP en précisant chaque fois la méthode et l’URL.

H & H: Research and Training 11 / 29


Exemple

Angular
Considérons le service personne.service.ts
import { Injectable } from ’@angular/core’;
import { Personne } from ’../interfaces/personne’;

@Injectable({
providedIn: ’root’
H I ©
})
UEL
export class PersonneService {
O
constructor() {
f E LM
url = ’http://localhost:5555/personnes/’;

ch r e
©A
}
getAll(){

}
addPerson(p: Personne){

}
}

H & H: Research and Training 12 / 29


Exemple

Angular
Dans le constructeur de la classe PersonneComponent, on injecte le service
PersonneService

import { Component, OnInit } from ’@angular/core’;


import { Personne } from ’../../interfaces/personne’;
import { PersonneService } from ’../../services/personne.service’;

H I ©
EL
@Component({
selector: ’app-personne’,
templateUrl: ’./personne.component.html’,
O U
})
styleUrls: [’./personne.component.css’]

f E LM
r e
export class PersonneComponent implements OnInit {
ch
©A
personne: Personne = {};
personnes: Array <Personne> = [];

constructor(private personneService: PersonneService) { }

ngOnInit() {
this.personnes = this.personneService.getAll();
}
}

H & H: Research and Training 13 / 29


Exemple

Angular

Le template personne.component.html où on affiche le résultat


H I ©
<ul>
UEL
<li *ngFor="let elt of personnes">
O
{{ elt.prenom }} {{ elt.nom }}
f E LM
</li>
ch r e
©A
</ul>

H & H: Research and Training 14 / 29


Exemple

Angular
Commençons par injecter le service HttpClient dans personne.service.ts
import { Injectable } from ’@angular/core’;
import { HttpClient } from ’@angular/common/http’;
import { Personne } from ’../interfaces/personne’;

@Injectable({
providedIn: ’root’
H I ©
})
export class PersonneService {
U EL
O
E LM
url = ’http://localhost:5555/personnes/’;
f
ch r e
constructor(private http: HttpClient) {

}
getAll(){
©A
}
addPerson(p: Personne){

}
}

H & H: Research and Training 15 / 29


Exemple

Il faut importer le module HttpClientModule dans app.module.ts pour utiliser


HttpClient

import { BrowserModule } from ’@angular/platform-browser’;


import { NgModule } from ’@angular/core’;
import { FormsModule } from ’@angular/forms’;
import { HttpClientModule } from ’@angular/common/http’;
//+ les autres imports

@NgModule({
H I ©
EL
declarations: [
AppComponent,
O U
LM
AdresseComponent,
PersonneComponent,
FormulaireComponent
r e f E
ch
],

©A
imports: [
BrowserModule,
FormsModule,
HttpClientModule
],
providers: [PersonneService],
bootstrap: [AppComponent]
})
export class AppModule { }

H & H: Research and Training 16 / 29


Exemple

Angular
Faisons une première requête HTTP pour récupérer la liste des personnes
import { Injectable } from ’@angular/core’;
import { HttpClient } from ’@angular/common/http’;
import { Personne } from ’../interfaces/personne’;

@Injectable({
providedIn: ’root’
H I ©
})
export class PersonneService {
U EL
O
E LM
url:string= "http://localhost:5555/personnes/";
f
ch r e
constructor(private http: HttpClient) {

} ©A
getAll(): Observable<Array<Personne>> {
return this.http.get<Array<Personne>>(this.url);
}
addPerson(p: Personne) {

}
}

HLa mResearch
& H: éthode and
getAll()
Training retourne un Observable. 17 / 29
Exemple

Pour récupérer la liste des personnes dans personne.component.ts, il faut s’abonner

import { Component, OnInit } from ’@angular/core’;


import { Personne } from ’../../interfaces/personne’;
import { PersonneService } from ’../../services/personne.service’;

@Component({
selector: ’app-personne’,
templateUrl: ’./personne.component.html’,
styleUrls: [’./personne.component.css’]
H I ©
})
UEL
export class PersonneComponent implements OnInit {
O
LM
personne: Personne = {};
personnes: Array <Personne> = [];

r e f E
ch
constructor(private personneService: PersonneService) { }

©A
ngOnInit(): void {
this.personneService.getAll().subscribe(res => {
this.personnes = res;
});
}
}

En lançant l’application, la liste de personnes est affichée.


H & H: Research and Training 18 / 29
Exemple

Récupérons le formulaire permettant d’ajouter une personne (voir chapitre formulaire)

<form #monForm=ngForm (ngSubmit)=ajouterPersonne()>


<div>
Nom : <input type=text name=nom [(ngModel)]=personne.nom required #
nom="ngModel">
</div>
<div [hidden]="nom.valid || nom.pristine">
Le nom est obligatoire
</div>
H I ©
<div>
U EL
O
Prénom : <input type=text name=prenom [(ngModel)]=personne.prenom

LM
required #prenom="ngModel">
</div>

r e f E
<div [hidden]="prenom.valid || prenom.pristine">

ch
Le prénom est obligatoire
</div>
<div> ©A
<button [disabled]=!monForm.valid>
ajouter
</button>
</div>
</form>
<!-- garder la partie permettant d’afficher les personnes -->

H & H: Research and Training 19 / 29


Exemple

Angular

Récupérons aussi les propriétés pour les classes CSS fournies


par Angular
H I ©
.ng-invalid:not(form){
UEL
border-left: 5px solid red; O
}
f E LM
.ng-valid:not(form){
ch r e
©A
border-left: 5px solid green;
}

H & H: Research and Training 20 / 29


Exemple

Angular
Préparons la requête HTTP permettant d’ajouter une personne

import { Injectable } from ’@angular/core’;


import { HttpClient } from ’@angular/common/http’;
import { Personne } from ’../interfaces/personne’;

@Injectable({
H I ©
EL
providedIn: ’root’
})
export class PersonneService {
O U
f E LM
url = ’http://localhost:5555/personnes/’;

ch r e
©A
constructor(private http: HttpClient) { }

getAll(): Observable<Array<Personne>> {
return this.http.get<Array<Personne>>(this.url);
}
addPerson(p: Personne): Observable<Personne> {
return this.http.post(this.url, p);
}
}

H & H: Research and Training 21 / 29


Exemple

Ajoutons la méthode ajouterPersonne() dans personne.component.ts


import { Component, OnInit } from ’@angular/core’;
import { Personne } from ’../../interfaces/personne’;
import { PersonneService } from ’../../services/personne.service’;

@Component({
selector: ’app-personne’,
templateUrl: ’./personne.component.html’,
styleUrls: [’./personne.component.css’]
H I ©
EL
})

personne: Personne = {};


O U
export class PersonneComponent implements OnInit {

personnes: Array<Personne> = [];

f E LM
constructor(private personneService: PersonneService) { }
ngOnInit() {
ch r e
©A
this.personneService.getAll().subscribe(res => {
this.personnes = res;
});
}
ajouterPersonne() {
this.personneService.addPerson(this.personne).subscribe(res => {
console.log(res);
});
}
}
H & H: Research and Training 22 / 29
Exemple

Angular
Si on essaye d’ajouter une personne

La personne est ajoutée dans le fichier personnes.json


Mais elle n’est pas affichée dans la page qu’après actualisation

H
Car on ne met pas à jour la liste des personnesI ©
U EL
O
f E LM
ch r e
©A

H & H: Research and Training 23 / 29


Exemple

Angular
Si on essaye d’ajouter une personne

La personne est ajoutée dans le fichier personnes.json


Mais elle n’est pas affichée dans la page qu’après actualisation

H
Car on ne met pas à jour la liste des personnesI ©
U EL
O
Deux solutions possibles
f E LM
ch r e
Soit on ajoute la personne au tableau personnes de la classe

©A
personne.component.ts lorsqu’on l’ajoute dans notre fichier
personnes.json
Soit on refait appel à la méthode getAll() de notre service
personne.service.ts dans personne.component.ts
lorsqu’on l’ajoute dans notre fichier personnes.json pour
mettre à jour le tableau personnes
H & H: Research and Training 23 / 29
Exemple

Modifions la méthode ajouterPersonne() dans personne.component.ts


// les imports
@Component({
selector: ’app-personne’,
templateUrl: ’./personne.component.html’,
styleUrls: [’./personne.component.css’]
})
export class PersonneComponent implements OnInit {
personne: Personne = {};
H I ©
EL
personnes: Array <Personne> = [];

OU
constructor(private personneService: PersonneService) { }

ngOnInit() {
L M
f E
this.personneService.getAll().subscribe(res => {
r e
ch
this.personnes = res;

}
});
© A
ajouterPersonne() {
this.personneService.addPerson(this.personne).subscribe(res => {
this.personneService.getAll().subscribe(result => {
this.personnes = result;
});
});
}
}
H & H: Research and Training 24 / 29
Exemple

Angular

H I ©
Question : que contient la variable res de l’exemple précédent
UEL
O
Elle contient l’objet qu’on a ajouté dans la base de données avec une

f E LM
valeur attribuée à id (et qu’on peut utiliser pour faire d’autres
opérations)
ch r e
©A

H & H: Research and Training 25 / 29


Exemple

Angular

Exercice
H I ©
U EL
Ajouter du code HTML dans personne.component.html, des
M
méthodes dans personne.component.ts O et des méthodes dans
personne.service.ts (avec f L
Eles méthodes HTTP delete et put)
r e
ch de supprimer des personnes.
pour permettre de modifier et
© A

H & H: Research and Training 26 / 29


Fichiers environment

Angular

Le répertoire environments

H I ©
contient deux fichiers permettant de définir les variables
d’environnement d’une application Angular
UEL
O
f E LM
environment.ts pour le mode développement

r e
environment.prod.ts pour le mode production
ch
©A
Angular remplacera automatiquement le premier fichier par le
deuxième fichier à chaque fois exécution de ng build --prod.

H & H: Research and Training 27 / 29


Fichiers environment

Angular

Contenu initial de environment.ts


export const environment = {
production: false,
};
H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 28 / 29


Fichiers environment

Angular

Contenu initial de environment.ts


export const environment = {
production: false,
};
H I ©
EL
M OU
f E L l’adresse le préfixe de nos API
Ajoutons dans environment.ts
REST
chr e
A
© environment = {
export const
production: false,
APIEndpoint: ’http://localhost:5555/’
};

H & H: Research and Training 28 / 29


Fichiers environment

Modifions personne.service.ts et utilisons la variable ajoutée dans environment.ts


import { Injectable } from ’@angular/core’;
import { HttpClient } from ’@angular/common/http’;
import { Personne } from ’../interfaces/personne’;
import { environment } from ’../../environments/environment’;

@Injectable({
providedIn: ’root’
})
H I ©
EL
export class PersonneService {

url: string;
O U
f E
constructor(private http: HttpClient) { LM
ch r e
const APIEndpoint = environment.APIEndpoint;

©A
this.url = APIEndpoint + ’personnes/’;
}

getAll() {
return this.http.get<Array<Personne>>(this.url);
}
addPerson(p: Personne) {
return this.http.post(this.url, p);
}
}
H & H: Research and Training 29 / 29