[LOGO]

Requêtes AJAX


Comme pour les TP précédents, on vous demande de créer un répertoire tp8 qui contiendra les exercices de cette feuille de TP et de faire un compte rendu de TP en HTML.

Exercice 1 : Un panier de fruits

On cherche à afficher le contenu d'un panier de fruit en faisant une requête AJAX puis en modifiant le DOM pour ajouter des lignes à une table HTML.

  1. Recopiez les fichiers exo1.html, basket.js, fruitQuantities.json et HTTPServer.py dans votre répertoire tp8.
    Dans la suite, vous devrez surtout modifier le code Javascript de basket.js.
  2. On cherche à écrire une requête AJAX qui va lire le fichier fruitQuantities.json.
    Créez un objet XMLHttpRequest, utilisez la méthode open() pour créer une requête sur le fichier fruitQuantities.json stocké sur le serveur Github (et non pas celui que vous avez copié localement), puis envoyez la requête au serveur avec la méthode send.
    Comment faire pour savoir si la requête a réussi ou échoué en utilisant les outils de développement de votre navigateur ?
    Testez si votre requête AJAX fonctionne avec Firefox et avec Chrome.
  3. Que se passe-t-il si vous essayez d'envoyer une requête pour récupérer une copie locale du fichier fruitQuantities.json ? Si vous avez un message d'erreur, comment pouvez-vous expliquer le contenu de ce message d'erreur ?
  4. En fonction de votre navigateur et de la version de celui-ci, il se peut que vous n'ayez pas pu accéder au fichier fruitQuantities.json. Pour éviter que ce genre de mésaventures ne se reproduise, vous allez lancer un serveur HTTP minimaliste sur votre propre machine. (Lisez bien toute la question, y compris le paragraphe qui commence par Attention, avant d'entamer les opérations qui suivent).
    Pour ce faire, ouvrez un terminal, placez-vous dans le répertoire tp8, puis lancez la commande python HTTPServer.py. Vous venez de lancer votre serveur HTTP dans le répertoire tp8, et alors le fichier fruitQuantities.json est accessible depuis l'URL http://localhost:8080/fruitQuantities.json.

    Attention : Si jamais votre ordinateur hébergeait déjà un service qui utilisait le port 8080, vous avez dû voir s'afficher un message d'erreur Port 8080 already in use. Dans ce cas, vous pouvez remplacer le port 8080 par le port 3000 (ou bien par n'importe quel port : il vous suffit de remplacer 3000 par votre numéro de port préféré) en lançant la commande suivante : python HTTPServer.py 3000. Le fichier fruitQuantities.json sera accessible depuis l'URL http://localhost:3000/fruitQuantities.json.
    Note : Si jamais vous avez l'habitude d'utiliser une autre commande ou méthode pour exécuter des scripts python, faites comme d'habitude. L'essentiel étant d'exécuter le script HTTPServer.py.
  5. Ajoutez une fonction pour écouter les événements readystatechange et si la requête a réussi, affichez le résultat de la propriété responseText dans la console.
  6. Transformez la chaine de caractère stockée dans responseText au format JSON en objet JavaScript.
    Quel est le type de variable JavaScript obtenue ?
  7. Affichez, dans la console, un tableau contenant les noms des champs stockés dans votre objet JSON.
    Note : Quelle fonction permet de créer un tel tableau ?
  8. Actuellement, le document exo1.html contient une table HTML. À l'aide de JavaScript, récupérez l'élément HTML correspondant à cette table, puis modifiez la table pour faire en sorte qu'elle contienne une ligne par fruit et deux colonnes : la première colonne contiendra le nom du fruit, et l'autre la quantité du fruit.
    Note : Vous devez modifier votre élément HTML uniquement à l'aide de votre code Javascript, et certainement pas en réécrivant à la main des portions du document exo1.html.
  9. On souhaite maintenant que le span quantity de la page HTML soit mis à jour avec la somme des quantités de tous les fruits. Comment faire ?

Exercice 2 : Combien ça coûte ?

On cherche à améliorer le code précédent pour calculer le prix du panier (en plus de la quantité de tous les fruits).
Pour cela, on va créer un nouveau fichier JSON (prices.json), contenant le prix d'une orange, d'une banane et d'une poire (et aucune autre information), et qui sera chargé pour calculer le prix d'un panier.

  1. Recopiez la page Web exo2.html dans votre répertoire tp8 puis recopiez votre fichier basket.js dans le fichier basket2.js.
  2. Quelle doit être la structure de données décrite dans le fichier prices.json ?
    Note : vous devez choisir votre structure en fonction de la façon dont vous voulez utiliser vos données
    Note 2 : si vous pensez à un tableau, pensez plus fort ! :-)
  3. Écrivez le fichier prices.json sachant que le prix d'une orange est 10 euros, le prix d'une banane est 20 euros et le prix d'une poire est 5 euros.
    Vérifiez que votre fichier respecte bien le format JSON en utilisant le validateur de JSON http://jsonlint.com/.
  4. Faites en sorte que le fichier prices.json soit chargé par une requête AJAX.
    Note : sachant que l'on charge déjà le fichier fruitQuantities.json avec une requête AJAX, faire en sorte qu'il y ait un seul code de chargement de requête AJAX (en faisant une fonction dont les deux arguments seront l'URL de la ressource que l'on veut charger et la fonction que l'on souhaitera appeler au moment où cette ressource aura été chargée).
  5. Faites en sorte de calculer le prix du panier et de mettre à jour la page Web avec le prix.

Exercice 3 : Les promesses n'engagent que ceux qui y croient

  1. Recopiez la page Web exo3.html dans votre répertoire tp8 puis recopiez votre fichier basket2.js dans le fichier basket3.js.
  2. Récupérer l'objet contenu dans le fichier prices.json sans créer de requête AJAX à la main, mais en s'aidant de la fonction fetch et de promesses.
  3. Faites en sorte de calculer le prix du panier et de mettre à jour la page Web avec le prix, mais en utilisant la fonction fetch et des promesses.