JavaScriptCode asynchrone

fetch()

Envoie une requête HTTP et renvoie une promesse avec la réponse du serveur (un objet Response).

Renvoie
Une promesse résolue avec un objet Response.
Sur cette page

Exemple

#
JavaScript
const response = await fetch('data:application/json,{"name":"Léa","level":7}')
console.log(response.ok, response.status)

const user = await response.json()
console.log(`${user.name} est au niveau ${user.level}`)
Console
true 200
Léa est au niveau 7

L’adresse data: contient la réponse directement dans l’adresse, donc elle fonctionne sans connexion à un serveur. Dans une vraie application, vous auriez à cet endroit une adresse d’API, par ex. "/api/users/7".

Définition et utilisation

#

La fonction fetch() récupère des données depuis le réseau. Elle prend une adresse de ressource et un objet de configuration optionnel, et renvoie une promesse qui se résout avec un objet Response dès que les en-têtes de la réponse arrivent. Vous lisez le contenu séparément, avec des méthodes comme response.json() ou response.text(), qui renvoient elles aussi des promesses.

Un piège important : fetch() ne rejette sa promesse qu’en cas d’erreur réseau, par exemple une absence de connexion ou une requête bloquée. Les réponses avec un code 404 ou 500 sont pour elle des succès. Vérifiez donc toujours response.ok (il vaut true pour les codes de 200 à 299) ou response.status.

Le deuxième argument permet de changer la méthode (POST, PUT, DELETE), d’ajouter des en-têtes et d’envoyer un contenu dans le champ body, en général du JSON préparé avec JSON.stringify(). L’option signal permet d’interrompre la requête, par exemple après un délai dépassé.

Les exemples de cette page n’ont pas accès au réseau, c’est pourquoi le premier récupère une adresse data:, dans laquelle les données sont écrites directement. Avec une vraie API, le code ressemble exactement à ça, seule l’adresse change.

Syntaxe

#
Syntaxe
fetch(resource)
fetch(resource, options)

Paramètres

#
  • resource

    chaîne de caractères, URL ou Request

    L’adresse de la ressource, par ex. "/api/courses" ou une URL complète.
  • options

    objet, optionnel

    Les paramètres de la requête, entre autres method, headers, body, signal et credentials.

Plus d’exemples

#
Vérifier response.ok
JavaScript
async function loadCourses() {
  const response = await fetch('/api/courses')

  if (!response.ok) {
    throw new Error(`Erreur HTTP : ${response.status}`)
  }

  return response.json()
}

try {
  const courses = await loadCourses()
  console.log(courses.length)
} catch (error) {
  console.log(error.message)
}
Résultat
Erreur HTTP : 404

Cet exemple nécessite un vrai serveur, donc il ne s’exécute pas dans l’aperçu. Le résultat montre ce qui se passe quand le serveur répond avec un code 404.

Envoyer des données avec POST
JavaScript
const response = await fetch('/api/progress', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ lessonId: 12, score: 95 })
})

const result = await response.json()
console.log(result)
Résultat
{ saved: true, points: 150 }

Cet exemple nécessite un vrai serveur, donc il ne s’exécute pas dans l’aperçu. Le résultat est un exemple de réponse d’API.

Délai d’expiration pour une requête
JavaScript
try {
  const response = await fetch('/api/ranking', { signal: AbortSignal.timeout(3000) })
  console.log(response.status)
} catch (error) {
  console.log(error.name)
}
Résultat
TimeoutError

Le résultat montre ce qui se passe quand le serveur ne répond pas dans les 3 secondes. La requête est alors interrompue, et fetch() rejette sa promesse.

Compatibilité des navigateurs

#

Largement disponible

Fonctionne dans tous les navigateurs modernes, y compris sur mobile. Vous pouvez l’utiliser sans crainte.

  • Chrome
  • Edge
  • Firefox
  • Safari

Bonnes pratiques

#
  • Vérifiez toujours response.ok. Les codes 404 et 500 ne rejettent pas la promesse renvoyée par fetch().
  • En envoyant du JSON, définissez l’en-tête Content-Type: application/json et convertissez les données en texte avec JSON.stringify().
  • Le contenu de la réponse ne peut être lu qu’une seule fois. Un second appel à response.json() sur la même réponse se terminera par une erreur.

Entrées associées

#

Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.