Déploiement
Déploiement • Chapitre 4 : Déploiement d'une application frontend

Connexion du frontend à une API distante

Apprenez à faire communiquer votre application frontend déployée sur un CDN avec votre API backend hébergée à distance : élimination définitive de localhost, protection contre le blocage Mixed Content (HTTPS) et résolution des règles CORS.

🚫
Bannir localhost

localhost dans le navigateur d'un visiteur pointe vers son propre ordinateur, pas vers votre serveur backend.

🔒
Règle Mixed Content

Un site servi en https:// bloque automatiquement tout appel HTTP non chiffré vers l'API.

🛡️
Autorisation CORS

L'API backend doit explicitement autoriser l'origine du frontend dans ses en-têtes HTTP de réponse.

🔀
Reverse Proxy

Alternative moderne : réécrire /api/* vers le backend pour contourner totalement les restrictions CORS.

api-service-production.ts
// 1. Récupération dynamique de l'URL selon l'environnement
const API_BASE_URL = import.meta.env.VITE_API_URL || 'https://api.monsite.com/v1';

// 2. Client HTTP résilient avec gestion du timeout et des erreurs
export async function fetchUsers() {
  const controller = new AbortController();
  const timeoutId = setTimeout(() => controller.abort(), 8000); // 8 secondes max

  try {
    const response = await fetch(API_BASE_URL + '/users', {
      method: 'GET',
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json'
      },
      signal: controller.signal
    });

    clearTimeout(timeoutId);

    if (!response.ok) {
      throw new Error('Erreur API (' + response.status + ') : ' + response.statusText);
    }

    return await response.json();
  } catch (error: any) {
    if (error.name === 'AbortError') {
      throw new Error('Le serveur backend met trop de temps à répondre (Timeout).');
    }
    throw error;
  }
}

Résoudre les 3 Pièges Critiques de la Connexion Frontend / Backend

1. Le Piège de "localhost" en Production

En phase d'apprentissage ou de développement local, nous prenons tous l'habitude d'écrire fetch('http://localhost:5000/api'). Mais dès que vous envoyez votre code sur Vercel :

Lorsque Madame Dupont consulte votre site depuis son smartphone 4G à Marseille, son navigateur tente d'interroger le port 5000 de son propre smartphone ! Ne trouvant évidemment aucun serveur Node ou Laravel sur son téléphone, l'application affiche un échec réseau immédiat (ERR_CONNECTION_REFUSED).

Solution : L'URL de l'API doit impérativement provenir d'une variable d'environnement (ex: VITE_API_URL) configurée sur le nom de domaine public de votre backend en production (ex: https://api.monsite.com).

2. Le Blocage de Sécurité "Mixed Content"

Les plateformes frontend comme Vercel ou Netlify activent le protocole sécurisé https:// par défaut.

Règle des navigateurs : Si votre frontend est en https://, le navigateur bloquera impitoyablement tout appel vers une API en http:// non sécurisée ! Il affichera dans la console : "Mixed Content: The page at 'https://...' was loaded over HTTPS, but requested an insecure resource 'http://...'. This request has been blocked."
👉 Action requise : Vous devez impérativement installer un certificat SSL (HTTPS) sur votre API distante avant de la connecter au frontend.

3. L'Erreur CORS et la Ruse du Reverse Proxy

Par sécurité, un navigateur interdit à un script provenant de https://mon-frontend.vercel.app de lire les données de https://mon-api.onrender.com, sauf si le backend l'autorise explicitement.

Option A : Autorisation côté Backend

Dans votre serveur Express / Laravel, autoriser l'origine du frontend :

// Express.js
app.use(cors({
  origin: 'https://mon-frontend.vercel.app',
  credentials: true
}));
Option B : Proxy Vercel / Netlify (Zéro CORS)

Rediriger les appels /api/* en interne vers le backend :

// vercel.json
{
  "rewrites": [{
    "source": "/api/:match*",
    "destination": "https://mon-api.onrender.com/api/:match*"
  }]
}

Diagnostic et Solutions des Pannes Réseau Frontend / Backend

Symptôme constatéCause RacineAction Corrective
ERR_CONNECTION_REFUSEDL'URL de l'API utilise encore localhost ou 127.0.0.1Remplacer par le nom de domaine de production via variable d'environnement
Blocked: Mixed ContentFrontend en https:// appelant une API en http://Activer HTTPS sur le serveur backend avec un certificat SSL Let's Encrypt
CORS Missing Allow OriginLe backend rejette les requêtes provenant du domaine du frontendConfigurer le middleware CORS du backend ou utiliser un proxy dans vercel.json
Erreur 504 Gateway TimeoutLe backend est endormi (cold start sur Render gratuit) ou a plantéAjouter un spinner de chargement et un gestionnaire d'attente (retry)