Académique Documents
Professionnel Documents
Culture Documents
Achref El Mouelhi
elmouelhi.achref@gmail.com
1 Introduction
2 Utilisation de json-server
3 Fonctionnement
4 Exemple
5 Fichiers environment
6 Package concurrently
Angular
Le protocole HTTP
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
Angular
Angular et les serveurs
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
Angular
json-server
Open-source
H I ©
UEL
Utilisant par défaut le port 3000 O
f E LM
ch r e
Documentation : https://github.com/typicode/json-server
©A
Angular
json-server
Open-source
H I ©
UEL
Utilisant par défaut le port 3000 O
f E LM
ch r e
Documentation : https://github.com/typicode/json-server
©A
Pour l’installer
npm install -g json-server
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 angular11
{
"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
}
]
}
Angular
Avant d’envoyer des requêtes HTTP au json-server
H I ©
Démarrer json-server sur le port 5555 en précisant le nom de la base de
EL
données
O U
f E LM
ch r e
©A
Angular
Avant d’envoyer des requêtes HTTP au json-server
H I ©
Démarrer json-server sur le port 5555 en précisant le nom de la base de
EL
données
O U
f E LM
Lancer le serveur
ch r e
©A
json-server -p 5555 personnes.json
Angular
Avant d’envoyer des requêtes HTTP au json-server
H I ©
Démarrer json-server sur le port 5555 en précisant le nom de la base de
EL
données
O U
f E LM
Lancer le serveur
ch r e
©A
json-server -p 5555 personnes.json
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
©
Angular
Explication
H I ©
EL
Pour récupérer une personne selon l’identifiant (33 par exemple)
OU
GET : http://localhost:5555/personnes/33
M
f E L
Pour ajouter une nouvelle personne
chr e
POST : http://localhost:5555/personnes
A
© les valeurs d’une personne existante (ayant l’identifiant 33)
Pour modifier
PUT : http://localhost:5555/personnes/33
Angular
x.component.html
{{ }}
[]
()
[( )]
H I ©
U EL
O
f E LM
r
Requête
ch e
©A
HTTP
Http
Client
Réponse
HTTP x.service.ts x.component.ts
Serveur
Application Angular
Angular
Explication
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.
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){
}
}
Angular
Dans le constructeur de la classe PersonneComponent, on injecte le service
PersonneService
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> = [];
ngOnInit() {
this.personnes = this.personneService.getAll();
}
}
Angular
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){
}
}
@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 { }
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
url = ’http://localhost:5555/personnes/’;
f LM
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 / 33
Exemple
@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;
});
}
}
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 -->
Angular
Angular
Préparons la requête HTTP permettant d’ajouter une 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);
}
}
@Component({
selector: ’app-personne’,
templateUrl: ’./personne.component.html’,
styleUrls: [’./personne.component.css’]
H I ©
EL
})
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 / 33
Exemple
Angular
Si on essaye d’ajouter une personne
H
Car on ne met pas à jour la liste des personnesI ©
U EL
O
f E LM
ch r e
©A
Angular
Si on essaye d’ajouter une personne
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 / 33
Exemple
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 / 33
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
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
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.
Angular
Angular
@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 / 33
Package concurrently
Angular
Objectif
H I ©
Ne plus démarrer séparément les deux serveurs JSON et Angular.
UEL
O
f E LM
ch r e
©A
Angular
Objectif
H I ©
Ne plus démarrer séparément les deux serveurs JSON et Angular.
UEL
O
f E LM
Solution ch r e
©A
Utiliser le package concurrently.
Angular
Package concurrently
Package NodeJS
H I ©
EL
Permettant d’exécuter plusieurs commandes simultanément
U
O
f E LM
Syntaxe concurrently "command1 arg" "command2 arg"
ch r e
©A
Angular
Package concurrently
Package NodeJS
H I ©
EL
Permettant d’exécuter plusieurs commandes simultanément
U
O
f E LM
Syntaxe concurrently "command1 arg" "command2 arg"
ch r e
©A
Pour l’installer
npm install concurrently --save
Angular
En exécutant la commande
npm start
H I ©
UEL
O
f E LM
ch r e
©A
Angular
En exécutant la commande
npm start
H I ©
EL
C’est la section scripts qui sera consultée et plus précisément
U
la partie start O
"scripts": {
f E LM
"ng": "ng",
ch r e
©A
"start": "ng serve",
"build": "ng build",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
},
Angular
Modifions la partie start pour pouvoir démarrer les deux serveurs simultanément
"scripts": {
"ng": "ng",
.json\"",
H I ©
"start": "concurrently \"ng serve\" \"json-server -p 5555 personnes
},
"e2e": "ng e2e"
r e f E
ch
©A
Angular
Modifions la partie start pour pouvoir démarrer les deux serveurs simultanément
"scripts": {
"ng": "ng",
"start": "concurrently \"ng serve\" \"json-server -p 5555 personnes
.json\"",
H I ©
"build": "ng build",
U EL
"test": "ng test",
O
LM
"lint": "ng lint",
},
"e2e": "ng e2e"
r e f E
ch
©A
Avant de tester, pensez à déplacer le fichier personne.json à la racine du projet.