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.
localhost dans le navigateur d'un visiteur pointe vers son propre ordinateur, pas vers votre serveur backend.
Un site servi en https:// bloque automatiquement tout appel HTTP non chiffré vers l'API.
L'API backend doit explicitement autoriser l'origine du frontend dans ses en-têtes HTTP de réponse.
Alternative moderne : réécrire /api/* vers le backend pour contourner totalement les restrictions CORS.
// 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;
}
} 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).
Les plateformes frontend comme Vercel ou Netlify activent le protocole sécurisé https:// par défaut.
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." 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.
Dans votre serveur Express / Laravel, autoriser l'origine du frontend :
Rediriger les appels /api/* en interne vers le backend :
| Symptôme constaté | Cause Racine | Action Corrective |
|---|---|---|
ERR_CONNECTION_REFUSED | L'URL de l'API utilise encore localhost ou 127.0.0.1 | Remplacer par le nom de domaine de production via variable d'environnement |
Blocked: Mixed Content | Frontend en https:// appelant une API en http:// | Activer HTTPS sur le serveur backend avec un certificat SSL Let's Encrypt |
CORS Missing Allow Origin | Le backend rejette les requêtes provenant du domaine du frontend | Configurer le middleware CORS du backend ou utiliser un proxy dans vercel.json |
Erreur 504 Gateway Timeout | Le backend est endormi (cold start sur Render gratuit) ou a planté | Ajouter un spinner de chargement et un gestionnaire d'attente (retry) |