Fetch API : Requêtes HTTP en JavaScript

GET, POST, PUT, DELETE, headers, gestion d'erreurs, AbortController — tout sur fetch()

10
Sections
20+
Exemples
ES2015+
Standard

SECTION 01

C'est quoi fetch ?

🌐 L'API native pour les requêtes HTTP

fetch() est la fonction native de JavaScript pour envoyer des requêtes HTTP (GET, POST, PUT, DELETE…). Elle remplace XMLHttpRequest et rend les bibliothèques comme jQuery ou Axios souvent inutiles.

// Syntaxe de base
const response = await fetch(url, options);

// fetch retourne une Promise qui se résout en un objet Response
// L'objet Response contient les headers, le statut, et le corps

fetch est disponible nativement dans tous les navigateurs modernes et dans Node.js 18+. Pas besoin d'installer quoi que ce soit.

SECTION 02

GET — lire des données

// GET simple — fetch utilise GET par défaut
async function getUsers()

// GET avec paramètres (query string)
async function searchUsers(query, page = 1)
// URL finale : /users?q=alice&page=1&limit=10

// Lire le corps comme texte (pas JSON)
const html = await fetch(« /page.html »).then(r => r.text());

// Lire comme Blob (fichier binaire, image…)
const blob = await fetch(« /image.png »).then(r => r.blob());

URLSearchParams est la façon propre de construire des query strings. Il gère l'encodage automatiquement (espace → %20, & → %26…).

SECTION 03

POST — envoyer des données

📤 Envoyer du JSON
async function createUser(user)

const newUser = await createUser();

📎 Envoyer un formulaire / fichier
// FormData — multipart/form-data (fichiers, formulaires)
const form = document.querySelector(« #upload-form »);

form.addEventListener(« submit », async (e) => );

// Upload d'un fichier manuellement
const formData = new FormData();
formData.append(« avatar », fileInput.files[0]);
formData.append(« nom », « Alice »);

await fetch(« /api/upload », );

⚠️ Avec FormData, ne mets pas le header Content-Type manuellement. Le navigateur le définit automatiquement avec le bon boundary multipart. Le définir toi-même casse la requête.

SECTION 04

PUT, PATCH, DELETE

// PUT — remplacer une ressource entière
await fetch(`/api/users/$`, );

// PATCH — modifier partiellement
await fetch(`/api/users/$`, );

// DELETE — supprimer
await fetch(`/api/users/$`, );

MéthodeRôleCorps
GETLire / récupérerNon
POSTCréerOui (JSON, FormData…)
PUTRemplacer entièrementOui
PATCHModifier partiellementOui
DELETESupprimerRarement

SECTION 05

Gestion des erreurs

🛡️ Le piège de fetch : il ne rejette pas sur les erreurs HTTP
// ⚠️ fetch rejette UNIQUEMENT sur les erreurs RÉSEAU
// (pas de connexion, DNS fail, CORS bloqué)
// Les erreurs HTTP (404, 500) sont des réponses « réussies » pour fetch

async function fetchData(url)

C'est le piège n°1 de fetch. Un 404 Not Found ou un 500 Server Error ne déclenche pas le catch. Il faut toujours vérifier response.ok (qui est true pour les statuts 200-299).

📊 Propriétés de l'objet Response
Propriété / MéthodeRetourne
response.oktrue si status 200-299
response.statusCode HTTP (200, 404, 500…)
response.statusText« OK », « Not Found »…
response.headersObjet Headers
response.json()Promise → objet JS
response.text()Promise → string
response.blob()Promise → Blob (binaire)
response.formData()Promise → FormData

SECTION 06

Headers et authentification

// Headers personnalisés
await fetch(« /api/data », );

// Token Bearer (JWT)
const token = localStorage.getItem(« token »);
await fetch(« /api/protected », );

// Cookies (cross-origin)
await fetch(« https://autre-domaine.com/api », );

SECTION 07

Annuler une requête (AbortController)

// Timeout — annuler après N ms
async function fetchWithTimeout(url, ms = 5000)

// Annuler lors d'un changement de page (SPA / React)
const controller = new AbortController();

fetch(« /api/data », )
.then(r => r.json())
.then(data => updateUI(data));

// Plus tard, si l'utilisateur navigue ailleurs :
controller.abort(); // la requête est annulée

// AbortSignal.timeout() — raccourci (2023+)
await fetch(url, );

SECTION 08

Fonction fetch réutilisable

🧱 Wrapper complet
const API_URL = « https://api.example.com »;

async function api(endpoint, = )

// Utilisation
const users = await api(« /users »);
const newUser = await api(« /users », {
method: « POST »,
body: ,
});
await api(`/users/$`, );

Ce wrapper centralise le Content-Type, le token, le timeout et la vérification response.ok. Adapte-le à ton projet — c'est le pattern utilisé par la plupart des apps front-end.

SECTION 09

Erreurs fréquentes

ErreurProblèmeSolution
Ne pas vérifier response.okLes erreurs 404/500 passent inaperçuesToujours if (!response.ok) throw
Oublier await response.json()On récupère une Promise, pas les donnéesDeux await : fetch + json()
Content-Type avec FormDataLe boundary multipart est casséNe pas mettre Content-Type avec FormData
Pas de try/catchErreurs réseau non géréesToujours entourer d'un try/catch
Requêtes en parallèle non optimiséesRequêtes séquentielles lentesPromise.all([fetch(…), fetch(…)])
CORS bloquéLe serveur n'autorise pas le domaineConfigurer le serveur ou utiliser un proxy

SECTION 10

Questions fréquentes

fetch vs Axios — lequel choisir ?
fetch est natif (pas de dépendance), léger et suffisant pour la majorité des projets. Axios ajoute des features : interceptors, transformation auto du body, timeout intégré, annulation simplifiée, support IE11. En 2026, fetch avec un petit wrapper couvre 95% des besoins. Préfère fetch pour les nouveaux projets.
Pourquoi fetch ne rejette pas sur 404 ?
Par design : un 404 est une réponse valide du serveur (le serveur a répondu, juste « pas trouvé »). fetch ne rejette que quand il n'y a aucune réponse (réseau coupé, DNS fail). C'est un choix volontaire de l'API — il faut vérifier response.ok.
Comment suivre la progression d'un upload ?
fetch ne supporte pas nativement le suivi de progression d'upload. Pour ça, utilise XMLHttpRequest avec l'événement upload.onprogress, ou une bibliothèque comme Axios qui le supporte. Pour le download, tu peux utiliser response.body (ReadableStream).
C'est quoi CORS ?
Cross-Origin Resource Sharing : une politique de sécurité du navigateur qui bloque les requêtes vers un domaine différent de celui de ta page. Le serveur doit envoyer les headers CORS (Access-Control-Allow-Origin) pour autoriser les requêtes. C'est un problème côté serveur, pas côté client.

Fetch API en JavaScript — Requêtes HTTP complètes

Référence : MDN Fetch API