Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
| web:js:ajax [2023/03/31 03:24] – [Promise] jcheron | web:js:ajax [2023/10/12 11:11] (Version actuelle) – [API Fetch] jcheron | ||
|---|---|---|---|
| Ligne 4: | Ligne 4: | ||
| ===== Promise ===== | ===== Promise ===== | ||
| - | Les promesses permettent d' | + | Les promesses permettent d' |
| ==== Promise ==== | ==== Promise ==== | ||
| - | Exemple : Chargement d'un script | + | === Exemple : Chargement d'un script |
| <sxh javascript> | <sxh javascript> | ||
| function loadScript(src) { | function loadScript(src) { | ||
| Ligne 20: | Ligne 21: | ||
| }); | }); | ||
| } | } | ||
| + | </ | ||
| + | * **resolve** permet d' | ||
| + | * **reject** qu' | ||
| + | |||
| + | === Utilisation === | ||
| + | |||
| + | <sxh javascript> | ||
| + | let promise = loadScript(" | ||
| + | |||
| + | promise.then( | ||
| + | script => alert(`${script.src} is loaded!`), | ||
| + | error => alert(`Error: | ||
| + | ); | ||
| </ | </ | ||
| ==== async/await ==== | ==== async/await ==== | ||
| + | |||
| + | L' | ||
| + | |||
| + | <sxh javascript; | ||
| + | function resolveAfter2Seconds() { | ||
| + | return new Promise(resolve => { | ||
| + | setTimeout(() => { | ||
| + | resolve(' | ||
| + | }, 2000); | ||
| + | }); | ||
| + | } | ||
| + | |||
| + | async function asyncCall() { | ||
| + | console.log(' | ||
| + | const result = await resolveAfter2Seconds(); | ||
| + | console.log(result); | ||
| + | // Expected output: " | ||
| + | } | ||
| + | |||
| + | asyncCall(); | ||
| + | </ | ||
| ===== API Fetch ===== | ===== API Fetch ===== | ||
| + | |||
| + | L'api fetch permet en javascript d' | ||
| + | |||
| + | **fetch** fonctionne selon la syntaxe suivante : | ||
| + | <sxh javascript; | ||
| + | let promise = fetch(url, [options]) | ||
| + | </ | ||
| + | |||
| + | * Requête vers une **url** cible | ||
| + | * en passant un tableau d' | ||
| + | |||
| + | Sans options, **fetch** effectue un simple **GET** téléchargeant le contenu. | ||
| + | |||
| + | Lors de l' | ||
| + | |||
| + | La réponse peut être analysée (via ses membres **status** ou **ok**, et on obtient son corps fourni sous la forme d'une seconde promesse : | ||
| + | |||
| + | <sxh javascript> | ||
| + | let response = await fetch(url); | ||
| + | |||
| + | if (response.ok) { // Statut dans les 200 | ||
| + | // obtenir le corps de réponse au format JSON | ||
| + | let json = await response.json(); | ||
| + | } else { | ||
| + | alert(" | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== Response ==== | ||
| + | ^Méthode ^Action ^ | ||
| + | ^response.headers() | Retourne les en-têtes de la réponse | | ||
| + | ^response.text() | Retourne la réponse sous forme de texte | | ||
| + | ^response.json() | Retourne la réponse au format JSON | | ||
| + | ^response.formData() | Retourne un objet FormData | | ||
| + | ^response.blob() | Retourne la réponse sous forme de blob (données binaires typées) | | ||
| + | |||
| + | ==== Exemples ==== | ||
| + | |||
| + | Requête vers l'api Github pour obtenir la liste des messages de commits d'un repo : | ||
| + | |||
| + | Version **await** : | ||
| + | <sxh javascript> | ||
| + | let url = ' | ||
| + | let response = await fetch(url); | ||
| + | |||
| + | let commits = await response.json(); | ||
| + | |||
| + | alert(commits[0].message); | ||
| + | </ | ||
| + | |||
| + | Version **then** | ||
| + | |||
| + | <sxh javascript> | ||
| + | fetch(' | ||
| + | .then(response => response.json()) | ||
| + | .then(commits => alert(commits[0].message)); | ||
| + | </ | ||
| + | |||
| + | |||
| + | Chargement d' | ||
| + | |||
| + | <sxh javascript> | ||
| + | let response = await fetch('/ | ||
| + | |||
| + | let blob = await response.blob(); | ||
| + | |||
| + | // Création d img | ||
| + | let img = document.createElement(' | ||
| + | img.style = ' | ||
| + | document.body.append(img); | ||
| + | |||
| + | // Affichage | ||
| + | img.src = URL.createObjectURL(blob); | ||
| + | |||
| + | setTimeout(() => { // Effacement après 3 secondes | ||
| + | img.remove(); | ||
| + | URL.revokeObjectURL(img.src); | ||
| + | }, 3000); | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | <div class=" | ||
| + | <button id=" | ||
| + | </ | ||
| + | < | ||
| + | | ||
| + | let response = await fetch('/ | ||
| + | |||
| + | let blob = await response.blob(); | ||
| + | |||
| + | let img = document.createElement(' | ||
| + | img.style = ' | ||
| + | document.body.append(img); | ||
| + | |||
| + | img.src = URL.createObjectURL(blob); | ||
| + | |||
| + | setTimeout(() => { // le cacher après 3 secondes | ||
| + | img.remove(); | ||
| + | URL.revokeObjectURL(img.src); | ||
| + | }, 3000); | ||
| + | }); | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ==== Headers ==== | ||
| + | === Response === | ||
| + | L' | ||
| + | |||
| + | <sxh javascript> | ||
| + | let response = await fetch(' | ||
| + | |||
| + | // récupération d'un header | ||
| + | alert(response.headers.get(' | ||
| + | |||
| + | // itération sur tous les headers | ||
| + | for (let [key, value] of response.headers) { | ||
| + | alert(`${key} = ${value}`); | ||
| + | } | ||
| + | </ | ||
| + | === Request === | ||
| + | Les headers de la requête sont envoyées au travers des options du fetch : | ||
| + | <sxh javascript> | ||
| + | let response = fetch(protectedUrl, | ||
| + | headers: { | ||
| + | Authentication: | ||
| + | } | ||
| + | }); | ||
| + | </ | ||
| + | |||
| + | ==== POST ==== | ||
| + | La méthode HTTP utilisée peut également être spécifiée au travers des options, comme les données envoyées dans le body : | ||
| + | <sxh javascript> | ||
| + | let user = { | ||
| + | name: ' | ||
| + | surname: ' | ||
| + | }; | ||
| + | |||
| + | let response = await fetch('/ | ||
| + | method: ' | ||
| + | headers: { | ||
| + | ' | ||
| + | }, | ||
| + | body: JSON.stringify(user) | ||
| + | }); | ||
| + | </ | ||
| + | |||