# Requêtes API SmartCommon fournit le hook ''useApi'' qui simplifie les appels API avec gestion automatique de l'authentification JWT, du rafraîchissement de token et de la gestion des erreurs. Documentation [ky](https://github.com/sindresorhus/ky) (client HTTP utilisé) ## Configuration ### 1. Configurer le Provider Le ''ApiProvider'' doit être configuré dans votre ''LibConfigProvider'' : ``` // src/appConfig.js export const appConfig = { debug: true, api: { prefixUrl: import.meta.env.VITE_API_URL, timeout: 30000, debug: true } }; ``` ``` // src/App.jsx import { Provider } from '@cap-rel/smartcommon'; import { appConfig } from './appConfig'; export const App = () => { return ( ); }; ``` ## Utilisation de useApi ### Importer le hook ``` import { useApi } from '@cap-rel/smartcommon'; ``` ### Structure retournée Le hook ''useApi'' retourne un objet avec les méthodes suivantes : ^ Méthode ^ Description ^ | ''login(body, options)'' | Connexion utilisateur, stocke automatiquement les tokens | | ''logout(options)'' | Déconnexion, supprime les tokens | | ''entities(options)'' | Récupère les entités disponibles (avant login) | | ''device(body, options)'' | Enregistre/sélectionne un appareil | | ''public'' | Instance ky pour les requêtes publiques | | ''private'' | Instance ky pour les requêtes authentifiées | ### Requête de connexion ``` import { useApi } from '@cap-rel/smartcommon'; import { Input, Button } from '@cap-rel/smartcommon'; export const Login = () => { const api = useApi(); const handleSubmit = async (e) => { e.preventDefault(); const formData = new FormData(e.target); const credentials = Object.fromEntries(formData.entries()); try { const user = await api.login({ ...credentials, rememberMe: true }); console.log('Connecté:', user); } catch (error) { console.error('Erreur de connexion:', error); } }; return (
); }; ``` ### Requêtes authentifiées Pour les requêtes nécessitant une authentification, utilisez ''api.private'' : ``` import { useApi } from '@cap-rel/smartcommon'; import { useState, useEffect } from 'react'; import { List, ListItem, Spinner } from '@cap-rel/smartcommon'; export const ItemsList = () => { const api = useApi(); const [items, setItems] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { const fetchItems = async () => { try { const data = await api.private.get('items').json(); setItems(data); } catch (error) { console.error('Erreur:', error); } finally { setLoading(false); } }; fetchItems(); }, []); if (loading) return ; return ( {items.map(item => ( {item.name} ))} ); }; ``` ### Requêtes POST/PUT/DELETE ``` const api = useApi(); // POST - Créer const createItem = async (data) => { return api.private.post('items', { json: data }).json(); }; // PUT - Modifier const updateItem = async (id, data) => { return api.private.put(`items/${id}`, { json: data }).json(); }; // DELETE - Supprimer const deleteItem = async (id) => { return api.private.delete(`items/${id}`).json(); }; ``` ### Requêtes publiques Pour les requêtes ne nécessitant pas d'authentification : ``` const api = useApi(); const fetchPublicData = async () => { return api.public.get('public/info').json(); }; ``` ## Fonctionnalités automatiques ### Gestion des tokens * Le token d'accès est automatiquement ajouté aux headers des requêtes privées * Le token est rafraîchi automatiquement avant expiration * En cas d'erreur 401, un refresh est tenté automatiquement ### Circuit breaker * Protection contre les requêtes en cascade en cas d'erreur serveur * Blocage temporaire des requêtes après plusieurs échecs * Détection automatique de la connexion internet ### Headers automatiques Chaque requête inclut automatiquement : * ''Authorization: Bearer '' (requêtes privées) * ''X-DEVICEID: '' (identification de l'appareil) ## Méthode classique (fetch natif) Si vous préférez utiliser fetch directement (non recommandé) : Documentation [API Fetch](https://developer.mozilla.org/fr/docs/Web/API/Fetch_API) ``` const API_URL = import.meta.env.VITE_API_URL; const request = { method: "POST", body: JSON.stringify(data), headers: { Accept: "application/json", "Content-Type": "application/json", Authorization: `Bearer ${token}` } }; fetch(`${API_URL}/items`, request) .then(response => response.json()) .then(json => console.log(json)) .catch(error => console.error(error)); ``` Il est recommandé d'utiliser ''useApi'' plutôt que fetch natif pour bénéficier de la gestion automatique des tokens et du circuit breaker. ## Voir aussi * [[stockage_de_donnees|Stockage de données]] - Pour persister les données localement * [[hooks|Hooks]] - Documentation complète des hooks * [[../back/start|Back (PHP)]] - Configuration des routes API côté serveur