Mocker son backend Angular avec JSON Server

La plupart du temps, votre application Angular doit communiquer avec un backend via une API REST qui utilise le JSON comme format de données. Mais souvent, vous commencez à développer votre frontend, mais le backend n’est pas encore prêt à vous servir de vraies données.

Pas d’inquiétude ! Dans cet article, je vais vous présenter JSON Server, un outil qui permet de mettre en place facilement une API REST fictive.

Pourquoi utiliser une API fictive ?

Tout d’abord, parlons des raisons pour lesquelles vous souhaiteriez disposer d’une API fictive. Mes trois principales raisons sont le prototypage, le mocking et l’enseignement.

Prototypage

Avec une API fictive, vous pouvez commencer à développer votre frontend sans attendre l’équipe backend. Vous commencez à écrire votre application Angular, vous la connectez à une API fictive, puis vous passez au véritable backend lorsqu’elle est prête. Cela peut également vous aider à concevoir les formes potentielles des réponses du serveur en collaboration avec l’équipe du backend.

Mocking

Pour les tests end to end, vous ne souhaitez généralement pas utiliser vos API réelles lorsque vous exécutez vos suites de tests. Une API fictive vous permet d’avoir une API réaliste pour vos tests sans vous soucier de remplir ou de réinitialiser votre base de données.

Enseignement

Dans les tutoriels, les démos, les ateliers et les cours en ligne, une API fictive peut s’avérer très utile, car elle permet de se focaliser sur l’enseignement au lieu de se préoccuper de la mise en place d’un backend.

Qu’est-ce que JSON Server ?

JSON Server est un serveur basé sur Express qui permet de créer une API REST fictive complète, en utilisant un fichier JSON comme base de données.

En écrivant cet article, j’essayais de trouver la meilleure façon de décrire JSON Server. J’ai alors jeté un second coup d’œil au README du dépôt Git du projet JSON Server. Il décrit JSON Server de la meilleure manière possible. JSON Server README

JSON Server est donc un outil qui aide les développeurs frontend à créer rapidement un prototype ou à simuler une API REST. L’intérêt de JSON Server réside dans le fait que vous n’avez pas besoin de mettre en place une véritable base de données. Votre base de données est un simple fichier JSON.

Comment mettre en place JSON Server ?

Voyons maintenant comment mettre en place JSON server.

Démarrer une nouvelle application Angular

Tout d’abord, créez une nouvelle application Angular appelée my-app à l’aide de l’Angular CLI :

ng new my-app --defaults

Naviguer dans le répertoire my-app

cd my-app

Installer JSON Server

JSON Server est disponible sous forme de packet npm que vous pouvez installer avec la commande suivante :

npm install --save-dev json-server

Créer le fichier représentant la base de données

Créez un fichier api/db.json ayant le contenu suivant :

{
"teams": [
{
"id": 1,
"name": "FC Barcelona",
"coach": "Xavi Hernandez",
"description": "The best football team in the world!"
},
{
"id": 2,
"name": "Real Madrid",
"coach": "Carlo Ancelotti",
"description": "The worst football team in the world!"
}
]
}

Le fichier api/db.json définit les endpoints de notre API fictive. Dans cet exemple, nous avons une seule ressource qui représente une équipe de football. Ainsi, la requête GET /teams retournera la liste d’équipes de football.

Créer un fichier de mapping des routes

Par défaut, les endpoints de JSON Server ne sont pas préfixés par /api. Nous allons donc utiliser le fichier routes.json pour configurer JSON Server afin qu’il préfixe tous les endpoints avec /api. Pour cela, créez un fichier nommé api/routes.json ayant le contenu suivant :

{
"/api/*": "/$1"
}

Cette configuration est cruciale car, dans notre application Angular, nous voulons que tous nos appels HTTP commencent par /api.

Ajouter un script de démarrage du serveur fictif

Ajoutez la paire clé/valeur suivante à la section scripts de votre package.json :

"api": "json-server api/db.json --routes api/routes.json --no-cors=true"

Démarrer le serveur fictif

Nous sommes maintenant prêts à lancer l’API fictive à l’aide de la commande suivante :

npm run api

Avec cette commande notre votre API fictive tournera sur http://localhost:3000.

JSON Server tournant sur http://localhost:3000

Communiquer avec l’API fictive depuis Angular

À présent, mettons en place la communication entre notre application Angular et l’API fictive JSON server.

Importer le module HttpClientModule

Avant de pouvoir envoyer des requêtes HTTP à un backend, vous devez configurer HttpClientModule. Ouvrez le fichier app.module.ts et ajoutez HttpClientModule au tableau des imports de l’AppModule :

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],
bootstrap: [AppComponent],
})
export class AppModule {}

Faire une requête vers le backend

Vous pouvez à présent injecter le service HttpClient dans le composant racine de l’application, AppComponent. Ensuite, créez une propriété appelée teams$ qui contiendra l’Observable des équipes renvoyées par notre requête GET.

import { Component } from '@angular/core';
import { HttpClient } from '@angular/common/http';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
teams$ = this.http.get<any>('http://localhost:3000/api/teams');
constructor(private http: HttpClient) {}
}

Afficher la liste des équipes

Utilisez à présent le pipe async et la directive *ngFor à l’intérieur du HTML (app.component.html) pour afficher la liste des équipes :

<h2>Teams</h2>
<div *ngFor="let team of teams$ | async">
<h3>{{team.name}}</h3>
<p>{{team.description}}</p>
</div>

Lancer l’application application

Vous pouvez maintenant démarrer l’application Angular grâce à la commande suivante :

ng serve --open

Cette commande ouvrira automatiquement votre navigateur par défaut grâce au flag --open. Mais rien ne s’affiche sur la page. Ouvrez les devtools, et vous verrez que la requête a échoué en raison de problèmes CORS.

Erreur CORS dans les devtools

Cela se produit parce que notre application Angular et notre backend ne sont pas sur le même domaine. Des ports différents sont équivalents à des noms de domaine différents.

Résoudre les problèmes CORS

Pour résoudre les problèmes CORS, le plus simple est d’éviter complètement les appels HTTP inter-domaines. La plupart du temps, notre frontend et notre backend résident dans le même domaine et nous n’avons donc pas de problème CORS en production.

Il s’agit donc d’un problème en local. La solution consiste à tirer parti du proxy intégré au serveur de développement de l’Angular CLI et à rendre tous nos appels HTTP relatifs.

Rendre les appels HTTP relatifs

Remplacez http://localhost:3000/api/teams par /api/teams à l’intérieur du composant AppComponent comme suit :

teams$ = this.http.get<any>('/api/teams');

En production, cette requête sera équivalente à GET http://my-app.com/api/teams si votre application est déployée sur my-app.com et votre backend sur my-app.com/api. Mais dans l’environnement de développement local, la requête sera équivalente à GET http://localhost:4200/api/teams alors que notre backend tourne sur http://localhost:3000/api/teams.

Pour résoudre ce problème, configurons le proxy disponible nativement dans l’Angular CLI.

Créer la configuration du proxy

Créez un fichier nommé proxy.conf.json à la racine de votre application ayant le contenu suivant :

{
"/api": {
"target": "http://localhost:3000"
}
}

Mettre à jour le fichier de configuration angular.json

Ouvrez le fichier angular.json et mettez à jour le contenu de la clé projects > my-app > architect > serve > configurations > development en ajoutant la paire clé/valeur "proxyConfig" : "proxy.conf.json"

{
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"configurations": {
"production": {
"browserTarget": "my-app:build:production"
},
"development": {
"proxyConfig": "proxy.conf.json",
"browserTarget": "my-app:build:development"
}
},
"defaultConfiguration": "development"
}
}

Avec cette configuration, en mode développement, toutes les requêtes qui commencent par /api atteindront http://localhost:3000 où réside notre API fictive. Il n’y a plus de problèmes CORS et lorsque vous allez déployer votre application en production, aucune modification n’est nécessaire à notre application Angular pour qu’elle fonctionne avec un vrai backend.

Redémarrer le serveur

Redémarrez le serveur pour prendre en compte la configuration du proxy et vérifiez à nouveau votre navigateur. La liste des équipes devrait s’afficher correctement :

La liste des équipes s'affiche correctement

Conclusion

Dans cet article, nous avons appris à utiliser JSON server pour mettre en place une API fictive. Nous avons également appris à configurer correctement nos applications Angular pour tirer parti du proxy intégré au CLI afin d’éviter les problèmes CORS en mode développement.


Vous aimez ce blog ?
Suivez-moi sur Twitter pour plus de contenu !

Rejoignez la newsletter pour du contenu de grande qualité dans votre boite mail

Pas de spam. Que du contenu de qualité.