BaliseTonSite

Erreurs API & reseau

Le brouillard de guerre : 404, CORS, timeout.

6.1Les codes HTTP : le langage du serveur

Chaque reponse HTTP a un code. C'est comme le visage du PNJ : tu sais tout de suite si ca s'est bien passe ou pas.

2xx : Succes

  • 200 : OK, tout va bien
  • 201 : Cree (POST reussi)
  • 204 : Succes, pas de contenu

4xx : Erreur client

  • 400 : Requete mal formee
  • 401 : Non authentifie
  • 403 : Interdit (pas les droits)
  • 404 : Ressource introuvable
  • 422 : Donnees invalides

5xx : Erreur serveur

  • 500 : Erreur interne serveur
  • 502 : Bad Gateway (proxy)
  • 503 : Service indisponible

3xx : Redirection

  • 301 : Redirection permanente
  • 307 : Redirection temporaire
  • 308 : Redirection permanente (POST)

6.2CORS : le mur invisible

CORS (Cross-Origin Resource Sharing) est le mur invisible qui bloque tes requetes. Ton navigateur refuse de charger des donnees d'un autre domaine sauf si le serveur l'autorise explicitement.

L'erreur CORS classiquebash
Access to fetch at 'https://api.example.com/data'
from origin 'http://localhost:3000'
has been blocked by CORS policy:
No 'Access-Control-Allow-Origin' header is present on the requested resource.

# En clair : le serveur api.example.com n'autorise pas
# les requetes depuis localhost:3000
Solutions CORS selon ton castypescript
// CAS 1 : Tu controles le serveur (API Route Next.js)
// -> Ajouter les headers CORS dans ta route
export async function GET() {
  return new Response(JSON.stringify({ data: "ok" }), {
    headers: {
      'Access-Control-Allow-Origin': '*', // Ou ton domaine specifique
      'Content-Type': 'application/json',
    },
  })
}

// CAS 2 : Tu ne controles PAS le serveur
// -> Passer par une API Route proxy
// app/api/proxy/route.ts
export async function GET() {
  // Pas de CORS ici car c'est du serveur-a-serveur
  const res = await fetch('https://api-externe.com/data')
  const data = await res.json()
  return Response.json(data)
}

// CAS 3 : En dev seulement
// -> next.config.ts avec rewrites
// Voir la doc Next.js pour les rewrites

6.3404 : la chasse a l'URL

Debug d'un 404typescript
// Le reflexe : verifier CHAQUE partie de l'URL

// 1. Le domaine
const baseUrl = process.env.NEXT_PUBLIC_API_URL  // Vide en prod ?
console.log("Base URL:", baseUrl)

// 2. Le path
const url = `${baseUrl}/api/users/${userId}`
console.log("Full URL:", url) // Le userId est-il correct ?

// 3. La methode HTTP
// POST au lieu de GET ? PUT au lieu de PATCH ?

// 4. Tester dans le navigateur
// Colle l'URL dans l'onglet Network ou directement dans la barre d'adresse

// Erreur la plus courante :
const url1 = "/api/users"    // Correct
const url2 = "api/users"     // Manque le / initial !
const url3 = "/api/users/"   // Le / final peut poser probleme

6.4Fetch qui echoue silencieusement

fetch() ne lance PAS d'erreur sur un 404 ou un 500. Il renvoie une reponse avec ok: false. Si tu ne verifies pas, tu as un bug silencieux.

Le piege du fetch silencieuxtypescript
// MAUVAIS : pas de verification
const response = await fetch('/api/users')
const data = await response.json() // Peut echouer si response n'est pas JSON

// BON : toujours verifier response.ok
const response = await fetch('/api/users')
if (!response.ok) {
  console.error(`Erreur ${response.status}: ${response.statusText}`)
  throw new Error(`HTTP ${response.status}`)
}
const data = await response.json()

// ENCORE MIEUX : wrapper reutilisable
async function safeFetch<T>(url: string): Promise<T> {
  const response = await fetch(url)
  if (!response.ok) {
    throw new Error(`Fetch failed: ${response.status} ${response.statusText}`)
  }
  return response.json()
}

6.5Timeout et connexion perdue

Gerer les timeoutstypescript
// fetch n'a pas de timeout par defaut !
// Si le serveur ne repond pas, ta requete attend... indefiniment.

// Solution : AbortController
const controller = new AbortController()
const timeout = setTimeout(() => controller.abort(), 5000) // 5s max

try {
  const response = await fetch('/api/data', {
    signal: controller.signal
  })
  clearTimeout(timeout)
  const data = await response.json()
} catch (error) {
  if (error instanceof Error && error.name === 'AbortError') {
    console.error("Requete annulee : timeout de 5 secondes depasse")
  }
}

6.6Le reflexe debug reseau

Checklist debug reseau

  1. 1. Ouvre l'onglet Network (F12)
  2. 2. Reproduis l'erreur
  3. 3. Trouve la requete en rouge
  4. 4. Verifie le Status (404 ? 500 ? CORS ?)
  5. 5. Clique sur la requete et regarde Response
  6. 6. Verifie Headers (URL correcte ? Auth presente ?)

Verifie tes acquis

5 questions pour valider ce chapitre

1. Que signifie un code HTTP 403 ?

Valide et sauvegarde ce chapitre

Ne perds pas le fil de ton apprentissage. Chaque QCM terminé sauvegarde ton score. Crée ton profil gratuitement pour débloquer toutes les évaluations du site et retrouver tes résultats plus tard.

Commencer l'aventure
Déjà membre ?Connecte-toi