# Construire une application bancaire Partie 3 : Méthodes de récupération et d’utilisation des données Pensez à l’ordinateur de l’Enterprise dans Star Trek - quand le Capitaine Picard demande l’état du vaisseau, l’information apparaît instantanément sans que toute l’interface ne s’arrête et se reconstruise. Ce flux d’informations fluide est exactement ce que nous construisons ici avec la récupération dynamique des données. Pour l’instant, votre application bancaire est comme un journal imprimé - informative mais statique. Nous allons la transformer en quelque chose de plus proche du centre de contrôle de la NASA, où les données circulent en continu et se mettent à jour en temps réel sans interrompre le flux de travail de l’utilisateur. Vous apprendrez à communiquer avec les serveurs de manière asynchrone, gérer des données qui arrivent à différents moments, et transformer des informations brutes en quelque chose de significatif pour vos utilisateurs. C’est la différence entre un simple démonstrateur et un logiciel prêt pour la production. ## ⚡ Ce que vous pouvez faire dans les 5 prochaines minutes **Parcours rapide pour développeurs occupés** ```mermaid flowchart LR A[⚡ 5 minutes] --> B[Configurer le serveur API] B --> C[Test de récupération avec curl] C --> D[Créer la fonction de connexion] D --> E[Voir les données en action] ``` - **Minute 1-2** : Lancez votre serveur API (`cd api && npm start`) et testez la connexion - **Minute 3** : Créez une fonction basique `getAccount()` utilisant fetch - **Minute 4** : Branchez le formulaire de connexion avec `action="javascript:login()"` - **Minute 5** : Testez la connexion et observez les données du compte apparaître dans la console **Commandes de test rapide** : ```bash # Vérifier que l'API fonctionne curl http://localhost:5000/api # Tester la récupération des données du compte curl http://localhost:5000/api/accounts/test ``` **Pourquoi c’est important** : En 5 minutes, vous verrez la magie de la récupération asynchrone des données qui alimente toutes les applications web modernes. C’est la base qui rend les applications réactives et vivantes. ## 🗺️ Votre parcours d’apprentissage des applications web axées sur les données ```mermaid journey title Des pages statiques aux applications dynamiques section Comprendre l'évolution Rechargements de page traditionnels: 3: You Découvrir les avantages d'AJAX/SPA: 5: You Maîtriser les modèles Fetch API: 7: You section Construire l'authentification Créer des fonctions de connexion: 4: You Gérer les opérations asynchrones: 6: You Gérer les sessions utilisateur: 8: You section Mises à jour dynamiques de l'interface utilisateur Apprendre la manipulation du DOM: 5: You Construire des affichages de transactions: 7: You Créer des tableaux de bord réactifs: 9: You section Modèles professionnels Rendu basé sur des templates: 6: You Stratégies de gestion des erreurs: 7: You Optimisation des performances: 8: You ``` **Votre destination d’apprentissage** : À la fin de cette leçon, vous comprendrez comment les applications web modernes récupèrent, traitent et affichent les données de façon dynamique, créant l’expérience utilisateur fluide que nous attendons des applications professionnelles. ## Quiz préalable à la leçon [Quiz préalable à la leçon](https://ff-quizzes.netlify.app/web/quiz/45) ### Prérequis Avant de plonger dans la récupération des données, assurez-vous d’avoir ces éléments prêts : - **Leçon précédente** : Terminez le [formulaire de connexion et d’inscription](../2-forms/README.md) - nous allons construire sur cette base - **Serveur local** : Installez [Node.js](https://nodejs.org) et [exécutez le serveur API](../api/README.md) pour fournir les données de compte - **Connexion API** : Testez la connexion à votre serveur avec cette commande : ```bash curl http://localhost:5000/api # Réponse attendue : "API bancaire v1.0.0" ``` Ce test rapide garantit que tous les éléments communiquent correctement : - Vérifie que Node.js fonctionne correctement sur votre machine - Confirme que votre serveur API est actif et répond - Valide que votre app peut atteindre le serveur (comme vérifier la radio avant une mission) ## 🧠 Aperçu de l’écosystème de gestion des données ```mermaid mindmap root((Gestion des données)) Authentication Flow Login Process Validation du formulaire Vérification des identifiants Gestion de la session User State Objet global du compte Gardes de navigation Gestion des erreurs API Communication Fetch Patterns Requêtes GET Requêtes POST Réponses d’erreur Data Formats Traitement JSON Encodage URL Analyse des réponses Dynamic UI Updates DOM Manipulation Mises à jour de texte sécurisées Création d’éléments Clonage de modèles User Experience Mises à jour en temps réel Messages d’erreur États de chargement Security Considerations XSS Prevention Utilisation de textContent Assainissement des entrées Création de HTML sécurisé CORS Handling Requêtes cross-origin Configuration des entêtes Configuration du développement ``` **Principe de base** : Les applications web modernes sont des systèmes d’orchestration des données - elles coordonnent entre interfaces utilisateur, APIs serveur, et modèles de sécurité des navigateurs pour créer des expériences fluides et réactives. --- ## Comprendre la récupération des données dans les applications web modernes La manière dont les applications web gèrent les données a énormément évolué au cours des deux dernières décennies. Comprendre cette évolution vous aidera à apprécier pourquoi des techniques modernes comme AJAX et l’API Fetch sont si puissantes et pourquoi elles sont devenues des outils indispensables pour les développeurs web. Explorons comment les sites traditionnels fonctionnaient comparé aux applications dynamiques et réactives que nous construisons aujourd’hui. ### Applications multi-pages traditionnelles (MPA) Aux débuts du web, chaque clic était comme changer de chaîne sur une vieille télévision - l’écran devenait blanc, puis se branchait lentement sur le nouveau contenu. C’était la réalité des premières applications web, où chaque interaction signifiait reconstruire entièrement la page depuis zéro. ```mermaid sequenceDiagram participant User participant Browser participant Server User->>Browser: Clique sur un lien ou soumet un formulaire Browser->>Server: Demande une nouvelle page HTML Note over Browser: La page devient blanche Server->>Browser: Renvoie la page HTML complète Browser->>User: Affiche la nouvelle page (clignotement/rechargement) ```  **Pourquoi cette approche semblait lourde :** - Chaque clic impliquait de reconstruire toute la page depuis le début - Les utilisateurs étaient interrompus dans leurs pensées par ces flashs de page agaçants - Votre connexion Internet travaillait en surchauffe en téléchargeant le même en-tête et pied de page en boucle - Les applications ressemblaient plus à cliquer dans un classeur qu’à utiliser un logiciel ### Applications monpage modernes (SPA) AJAX (Asynchronous JavaScript and XML) a complètement changé ce paradigme. À l’image du design modulaire de la Station Spatiale Internationale, où les astronautes peuvent remplacer des composants individuels sans tout reconstruire, AJAX nous permet de mettre à jour des parties spécifiques d’une page web sans tout recharger. Malgré le nom évoquant XML, on utilise aujourd’hui surtout JSON, mais le principe reste : ne mettre à jour que ce qui doit changer. ```mermaid sequenceDiagram participant User participant Browser participant JavaScript participant Server User->>Browser: Interagit avec la page Browser->>JavaScript: Déclenche le gestionnaire d'événements JavaScript->>Server: Récupère uniquement les données nécessaires Server->>JavaScript: Retourne les données JSON JavaScript->>Browser: Met à jour des éléments spécifiques de la page Browser->>User: Affiche le contenu mis à jour (sans rechargement) ```  **Pourquoi les SPA sont tellement mieux ressenties :** - Seules les parties effectivement modifiées sont mises à jour (intelligent, non ?) - Plus d’interruptions brutales - vos utilisateurs restent dans leur flux - Moins de données sur le réseau signifie un chargement plus rapide - Tout est fluide et réactif, comme les apps sur votre téléphone ### L’évolution vers l’API moderne Fetch Les navigateurs modernes proposent l’[API `Fetch`](https://developer.mozilla.org/docs/Web/API/Fetch_API), qui remplace l’ancienne [`XMLHttpRequest`](https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest). Comme la différence entre utiliser un télégraphe et envoyer un email, Fetch API utilise les promesses pour un code asynchrone plus propre et gère naturellement le JSON. | Fonctionnalité | XMLHttpRequest | Fetch API | |----------------|----------------|-----------| | **Syntaxe** | Basée sur des callbacks complexes | Basée sur des promesses claires | | **Gestion JSON** | Analyse manuelle requise | Méthode intégrée `.json()` | | **Gestion des erreurs** | Informations d’erreur limitées | Détails d’erreur complets | | **Support moderne** | Compatibilité legacy | Promesses ES6+ et async/await | > 💡 **Compatibilité des navigateurs** : Bonne nouvelle - l’API Fetch fonctionne dans tous les navigateurs modernes ! Si vous êtes curieux des versions spécifiques, [caniuse.com](https://caniuse.com/fetch) présente le tableau complet de compatibilité. > **En résumé :** - Fonctionne parfaitement sur Chrome, Firefox, Safari et Edge (en gros partout où sont vos utilisateurs) - Seul Internet Explorer nécessite une aide supplémentaire (et honnêtement, il est temps de laisser tomber IE) - Vous prépare parfaitement pour les élégants patterns async/await que nous utiliserons plus tard ### Implémentation de la connexion utilisateur et récupération des données Passons maintenant à la mise en place du système de connexion qui transforme votre application bancaire d’un affichage statique à une application fonctionnelle. À l’image des protocoles d’authentification utilisés dans des installations militaires sécurisées, nous vérifierons les identifiants utilisateur puis fournirons l’accès à leurs données spécifiques. Nous construirons cela pas à pas, en commençant par l’authentification basique puis en ajoutant les capacités de récupération de données. #### Étape 1 : Créer la base de la fonction de connexion Ouvrez votre fichier `app.js` et ajoutez une nouvelle fonction `login`. Elle gérera le processus d’authentification utilisateur : ```javascript async function login() { const loginForm = document.getElementById('loginForm'); const user = loginForm.user.value; } ``` **Décortiquons cela :** - Ce mot-clé `async` ? Il indique à JavaScript « hé, cette fonction pourrait devoir patienter » - On récupère notre formulaire depuis la page (rien de compliqué, juste retrouver par son ID) - Puis on extrait ce que l’utilisateur a tapé comme nom d’utilisateur - Astuce sympa : vous pouvez accéder à n’importe quel champ de formulaire par son attribut `name` - pas besoin d’appels supplémentaires getElementById ! > 💡 **Accès aux formulaires** : Chaque contrôle de formulaire peut être accédé par son nom (défini en HTML via l’attribut `name`) en tant que propriété de l’élément formulaire. Cela offre une façon claire et lisible de récupérer les données du formulaire. #### Étape 2 : Créer la fonction de récupération des données de compte Ensuite, créons une fonction dédiée pour récupérer les données du compte depuis le serveur. Cela suit le même modèle que votre fonction d’inscription mais se concentre sur la récupération de données : ```javascript async function getAccount(user) { try { const response = await fetch('//localhost:5000/api/accounts/' + encodeURIComponent(user)); return await response.json(); } catch (error) { return { error: error.message || 'Unknown error' }; } } ``` **Voici ce que fait ce code :** - **Utilise** l’API `fetch` moderne pour demander les données de manière asynchrone - **Construit** une URL de requête GET avec le paramètre du nom d’utilisateur - **Applique** `encodeURIComponent()` pour gérer proprement les caractères spéciaux dans l’URL - **Convertit** la réponse en format JSON pour faciliter la manipulation des données - **Gère** les erreurs avec élégance en renvoyant un objet erreur plutôt que de planter > ⚠️ **Note de sécurité** : La fonction `encodeURIComponent()` gère les caractères spéciaux dans les URLs. À l’image des systèmes de codage utilisés dans les communications navales, elle assure que votre message arrive exactement comme prévu, sans risque qu’un caractère comme "#" ou "&" soit mal interprété. > **Pourquoi c’est important :** - Empêche les caractères spéciaux de casser les URLs - Protège contre des attaques de manipulation d’URL - Assure que votre serveur reçoit bien les données prévues - Suit les bonnes pratiques de développement sécurisé #### Comprendre les requêtes HTTP GET Voici quelque chose qui pourrait vous surprendre : quand vous utilisez `fetch` sans options supplémentaires, il crée automatiquement une requête [`GET`](https://developer.mozilla.org/docs/Web/HTTP/Methods/GET). C’est parfait pour ce que nous faisons - demander au serveur « hé, puis-je voir les données de compte de cet utilisateur ? » Pensez aux requêtes GET comme des demandes polies d’emprunter un livre à la bibliothèque - vous demandez à voir quelque chose qui existe déjà. Les requêtes POST (que nous avons utilisées pour l’inscription) sont plutôt comme soumettre un nouveau livre à ajouter à la collection. | Requête GET | Requête POST | |-------------|--------------| | **But** | Récupérer des données existantes | Envoyer de nouvelles données au serveur | | **Paramètres** | Dans le chemin/chaîne de requête de l’URL | Dans le corps de la requête | | **Mise en cache** | Peut être mise en cache par les navigateurs | Typiquement non mise en cache | | **Sécurité** | Visible dans l’URL/logs | Cachée dans le corps de la requête | ```mermaid sequenceDiagram participant B as Navigateur participant S as Serveur Note over B,S: Requête GET (Récupération de données) B->>S: GET /api/accounts/test S-->>B: 200 OK + Données du compte Note over B,S: Requête POST (Soumission de données) B->>S: POST /api/accounts + Nouvelles données du compte S-->>B: 201 Créé + Confirmation Note over B,S: Gestion des erreurs B->>S: GET /api/accounts/nonexistent S-->>B: 404 Non trouvé + Message d'erreur ``` #### Étape 3 : Tout assembler Voici la partie satisfaisante - connectons votre fonction de récupération des comptes au processus de connexion. C’est là que tout s’imbrique : ```javascript async function login() { const loginForm = document.getElementById('loginForm'); const user = loginForm.user.value; const data = await getAccount(user); if (data.error) { return console.log('loginError', data.error); } account = data; navigate('/dashboard'); } ``` Cette fonction suit une séquence claire : - Extrait le nom d’utilisateur depuis le champ du formulaire - Demande les données du compte utilisateur au serveur - Gère les erreurs qui peuvent survenir durant le processus - Stocke les données du compte et navigue vers le tableau de bord en cas de succès > 🎯 **Pattern Async/Await** : Comme `getAccount` est une fonction asynchrone, on utilise le mot-clé `await` pour suspendre l’exécution jusqu’à ce que le serveur réponde. Cela empêche le code de continuer avec des données indéfinies. #### Étape 4 : Créer un emplacement pour vos données Votre application a besoin d’un endroit pour mémoriser les informations du compte une fois chargées. Pensez à cela comme la mémoire à court terme de votre app - un endroit pour garder sous la main les données de l’utilisateur actuel. Ajoutez cette ligne en haut de votre fichier `app.js` : ```javascript // Ceci contient les données du compte de l'utilisateur actuel let account = null; ``` **Pourquoi c’est nécessaire :** - Garde les données du compte accessibles de partout dans votre app - Commencer avec `null` signifie « personne n’est encore connecté » - Est mise à jour quand quelqu’un se connecte ou s’inscrit avec succès - Sert de source unique de vérité - pas de confusion sur l’utilisateur connecté #### Étape 5 : Connecter votre formulaire Connectons maintenant votre toute nouvelle fonction de connexion à votre formulaire HTML. Mettez à jour votre balise formulaire ainsi : ```html
``` **Ce que ce petit changement fait :** - Empêche le formulaire d’exécuter son comportement par défaut « recharger toute la page » - Appelle votre fonction JavaScript personnalisée à la place - Garde tout fluide, comme une application monpage - Vous donne un contrôle total sur ce qui se passe quand les utilisateurs cliquent sur « Connexion » #### Étape 6 : Améliorer votre fonction d’inscription Pour plus de cohérence, mettez à jour votre fonction `register` pour qu’elle stocke aussi les données du compte et navigue vers le tableau de bord : ```javascript // Ajoutez ces lignes à la fin de votre fonction d'enregistrement account = result; navigate('/dashboard'); ``` **Cet ajout fournit :** - **Transition fluide** de l’inscription vers le tableau de bord - **Expérience utilisateur cohérente** entre le flux de connexion et d’inscription - **Accès immédiat** aux données du compte après inscription réussie #### Tester votre implémentation ```mermaid flowchart TD A[Utilisateur saisit les identifiants] --> B[Fonction de connexion appelée] B --> C[Récupérer les données du compte depuis le serveur] C --> D{Données reçues avec succès ?} D -->|Oui| E[Stocker les données du compte globalement] D -->|Non| F[Afficher un message d'erreur] E --> G[Naviguer vers le tableau de bord] F --> H[L'utilisateur reste sur la page de connexion] ``` **Il est temps de tester :** 1. Créez un nouveau compte pour vous assurer que tout fonctionne 2. Essayez de vous connecter avec ces mêmes identifiants 3. Jetez un œil à la console de votre navigateur (F12) si quelque chose semble bizarre 4. Assurez-vous d’arriver sur le tableau de bord après une connexion réussie Si quelque chose ne marche pas, pas de panique ! La plupart des problèmes sont des fautes de frappe ou un serveur API non lancé. #### Un mot rapide sur la magie Cross-Origin Vous vous demandez peut-être : « Comment mon app web peut-elle parler à ce serveur API alors qu’ils tournent sur des ports différents ? » Excellente question ! Cela touche à un point que tout développeur web rencontre tôt ou tard. > 🔒 **Sécurité Cross-Origin** : Les navigateurs appliquent une « politique de même origine » pour empêcher les communications non autorisées entre domaines différents. À l’image du système de contrôle au Pentagone, ils vérifient que la communication est autorisée avant d’autoriser le transfert de données. > **Dans notre configuration :** - Votre app web tourne sur `localhost:3000` (serveur de dev) - Votre serveur API tourne sur `localhost:5000` (serveur backend) - Le serveur API inclut des [en-têtes CORS](https://developer.mozilla.org/docs/Web/HTTP/CORS) qui autorisent explicitement la communication avec votre app web Cette configuration reflète le développement réel où les apps frontend et backend tournent généralement sur des serveurs séparés. > 📚 **En savoir plus** : Approfondissez les APIs et la récupération de données avec ce [module complet Microsoft Learn sur les APIs](https://docs.microsoft.com/learn/modules/use-apis-discover-museum-art/?WT.mc_id=academic-77807-sagibbon). ## Donner vie à vos données dans le HTML Maintenant, nous allons rendre les données récupérées visibles aux utilisateurs via la manipulation du DOM. Comme le processus de développement de photographies dans une chambre noire, nous transformons des données invisibles en quelque chose que les utilisateurs peuvent voir et manipuler. La manipulation du DOM est la technique qui transforme des pages web statiques en applications dynamiques qui mettent à jour leur contenu en fonction des interactions utilisateur et des réponses du serveur. ### Choisir le bon outil pour le travail Quand il s'agit de mettre à jour votre HTML avec JavaScript, vous avez plusieurs options. Pensez-y comme à différents outils dans une boîte à outils - chacun parfait pour des tâches spécifiques : | Méthode | Ce pour quoi elle est idéale | Quand l'utiliser | Niveau de sécurité | |---------|-----------------------------|------------------|--------------------| | `textContent` | Affichage sécurisé des données utilisateur | Chaque fois que vous affichez du texte | ✅ Solide comme un roc | | `createElement()` + `append()` | Construction de mises en page complexes | Création de nouvelles sections/listes | ✅ Infaillible | | `innerHTML` | Définition du contenu HTML | ⚠️ Essayez d'éviter celui-ci | ❌ Risqué | #### La façon sûre d'afficher du texte : textContent La propriété [`textContent`](https://developer.mozilla.org/docs/Web/API/Node/textContent) est votre meilleur allié pour afficher les données utilisateur. C'est comme avoir un videur pour votre page web - rien de nuisible ne passe : ```javascript // La méthode sûre et fiable pour mettre à jour le texte const balanceElement = document.getElementById('balance'); balanceElement.textContent = account.balance; ``` **Avantages de textContent :** - Traite tout comme du texte brut (empêche l'exécution de scripts) - Efface automatiquement le contenu existant - Efficace pour des mises à jour de texte simples - Offre une sécurité intégrée contre les contenus malveillants #### Créer des éléments HTML dynamiques Pour un contenu plus complexe, combinez [`document.createElement()`](https://developer.mozilla.org/docs/Web/API/Document/createElement) avec la méthode [`append()`](https://developer.mozilla.org/docs/Web/API/ParentNode/append) : ```javascript // Méthode sûre pour créer de nouveaux éléments const transactionItem = document.createElement('div'); transactionItem.className = 'transaction-item'; transactionItem.textContent = `${transaction.date}: ${transaction.description}`; container.append(transactionItem); ``` **Comprendre cette approche :** - **Crée** de nouveaux éléments DOM de manière programmatique - **Maintient** un contrôle total sur les attributs et le contenu des éléments - **Permet** des structures d'éléments imbriqués complexes - **Préserve** la sécurité en séparant la structure du contenu > ⚠️ **Considération de sécurité** : Bien que [`innerHTML`](https://developer.mozilla.org/docs/Web/API/Element/innerHTML) apparaisse dans de nombreux tutoriels, il peut exécuter des scripts intégrés. Comme les protocoles de sécurité au CERN qui empêchent l'exécution non autorisée de code, l'utilisation de `textContent` et `createElement` offre des alternatives plus sûres. > **Risques de innerHTML :** - Exécute toutes les balises `