AJAX§

1

Principe§

2

Jusqu'à maintenant...§

3

Ce serait bien si...§

4

Définition§

AJAX signifie

... mais en pratique, on peut échanger n'importe quoi avec le serveur, pas uniquement du XML.

5

Fetch§

La fonction fetch permet d’aller chercher une ressource sur un serveur de façon asynchrone.

6

L'objet Response§

Il représente la réponse à une requête HTTP.

7

L’objet Promise§

8

La méthode then§

Ajoute un gestionnaire de succès et un gestionnaire d’échec à la promesse.

Indication

then se comporte comme un listener qui écoute le changement d’état de la promesse.

9

La méthode then§

//send HTTP request
fetch('json/chapitre1.json')
//then waits for the Response
  .then(
    function(response){//the request succeeds
      console.log('success:' + response.status); },
    function(error){ //network problem
      console.log('fetch fails:');
      console.log(error);
    }
  );
10

Chaîne de promesses§

Les promesses peuvent être enchaînées.

fetch('json/chapitre1.json')
  //then waits for the Response
  .then(
    function(response){return response.json();},
    function(error){console.log(error) ;})
  //then wait for the json parsing
  .then(
    function(data){console.log(data); },
    function(error){console.log(error);}//format error
  );
11

La méthode catch§

//send HTTP request
fetch('json/chapitre1.json')
  .then(function(response){ //the request succeeds
    console.log('success:' + response.status); })
  .catch(function(error){ //network problem
    console.log('fetch fails:');
    console.log(error);
  });
12

Les méthodes then et catch§

fetch('toto')
  .then((x) => 42) // "enveloppe" 42 dans une promesse
  .then((y) => console.log(y)); // Affiche 42
13

Gestion "factorisée" des erreurs§

fetch('json/chapitre1.json')
  //then waits for the Response
  .then(function(response){
    return response.json();
  }})
  //then wait for the json parsing
  .then(function(data){
    //do what you have to do with data
  })
  //captures and displays all errors
  .catch(function(error){
    console.log(error);
  })
  //avoids duplicated code in then () and catch ()
  .finally(function(){
    console.log('Process completed');
  });
14

Exceptions personnalisées§

Il est inutile de parser le contenu d’une réponse "404 Not Found".

fetch('json/chapitre1.json')
  .then(function(response){
    if(response.ok){return response.json();}
    else{throw("Err " + response.status);}
  })
  //then waits for the json parsing
  .then(function(data){
  //do what you have to do with data
  })
  //captures any rejected promise
  .catch(function(error){console.log(error);
  });

Indication

L’exception lancée dans le callback du 1er then sera "convertie" en "promesse échouée", et donc sera propagée jusqu’à l’appel de catch.

15

AJAX et Sécurité§

16

Imaginez...§

17

Imaginez...§

18

Règles de sécurité§

Pour éviter ce genre d'attaque, fetch possède des limitations :

19

CORS en deux mots§

20

CORS en deux mots§

Remarques

  • Une solution consiste à utiliser un proxy tel que https://crossorigin.me/ .
  • Auparavant, d'autres méthodes ont été proposées pour permettre des accès cross-domain, comme JSONP.
21

Objets Javascript et JSON§

22

Principe§

const p = {
  "nom": "Doe",
  "prénom": "John",
  "age": 42
};

Indication

Les attributs peuvent contenir n'importe quel type, y compris bien sûr des types complexes comme des tableaux ou d'autres objets.

23

Utilisation§

24

Utilisation§

Remarque

Cela dit, les caractères accentués (comme dans prénom ci-dessus) sont autorisés. On aurait donc, dans ce cas, pu écrire :

let pr = p.prénom ;
25

Modification§

p.prénom = "Jane" ;
p.adresse = "42, Main road" ;
delete p.age ;
26

JSON§

JSON (Javascript Object Notation) est un sous-ensemble du langage Javascript, utilisé comme format de données sur le Web.

27

Données supportées par JSON§

28

Données supportées par JSON§

Syntaxe

  • Les chaînes de caractères doivent être entourées par des guillemets doubles (les guillemets simples ne sont pas supportés).
  • Les nom des attributs des objets doivent être entre guillemets doubles.
  • NB: null est supporté, mais pas undefined
  • Des structures complexes peuvent être représentées en JSON : tableaux d'objets, objets contenant d'autres objets...
29

Format d'échange§

30

Utilisation§

31

TP : Livre dont vous êtes le héros§

32

Sujet§

Indication

Pour les liens du livre, il vous est conseillé

  • d'utiliser des liens HTML internes (href="#xyz") qui n'entrainent pas de rechargement de la page, et
  • d'intercepter les changements en vous abonnant à l'événement hashchange de window, et en utilisant window.location pour déterminer le contenu à afficher.
33

Sujet§

Remarque

Une alternative consisterait à intercepter les clics sur les liens, pour savoir quand charger et afficher les éléments du livre. Cette solution peut sembler plus naturelle pour le programmeur, mais elle crée une expérience utilisateur moins bonne :

  • la "navigation" à l'intérieur du livre n'est pas stockée dans l'historique du navigateur ;
  • par conséquent, le bouton "retour" ne fonctionne pas ;
  • un rechargement de la page redémarre au premier élément ;
  • il n'est pas possible de mettre un signet sur l'endroit où l'on se trouve.
34

Annexe§

35

ECMAScript 2017: async/await§

async function downloadFirstChap(){
  try{
    let response = await fetch('json/chapitre1. json');
    let data = await response.json() ; //do what you have to do with data
  }
  catch(error){
    console.log(error);
  }
}
36

ECMAScript 2017: async/await§

async function downloadFirstChap(){
  try{
    let response = await fetch('json/chapitre1. json');
    let data = await response.json(); //do what you have to do with data
  }
  catch(error){
    console.log(error);
  }
}

Avertissement

Si on oublie le await devant une fonction qui retourne une promesse, la variable contient une promesse, pas son résultat quand cette promesse est résolue → source de bug parfois difficile à détecter !

37