Versionner une API pour apps mobiles : faire évoluer les endpoints sans casser les clients
Versioning dâAPI pour apps mobiles expliquĂ© avec un plan de dĂ©ploiement simple, des changements rĂ©trocompatibles et des Ă©tapes de dĂ©prĂ©ciation pour que les anciennes versions restent fonctionnelles.

Pourquoi les changements dâAPI cassent les utilisateurs mobiles
Les applications mobiles ne se mettent pas toutes Ă jour en mĂȘme temps. MĂȘme si vous publiez un correctif aujourdâhui, beaucoup de personnes garderont une ancienne version pendant des jours ou des semaines. Certains dĂ©sactivent les mises Ă jour automatiques. Dâautres manquent dâespace. Certains nâouvrent tout simplement pas lâapp souvent. Le dĂ©lai des validations sur les stores et les releases progressives ajoutent encore du retard.
Cet Ă©cart compte parce que votre backend Ă©volue gĂ©nĂ©ralement plus vite que vos clients mobiles. Si le serveur modifie un endpoint et que lâancienne app continue de lâappeler, lâapp peut se casser mĂȘme si rien nâa changĂ© sur le tĂ©lĂ©phone de lâutilisateur.
Les rĂ©gressions nâapparaissent que rarement comme un message dâerreur clair. Elles ressemblent plutĂŽt Ă des problĂšmes produits quotidiens :
- Lâauthentification ou lâinscription Ă©choue aprĂšs une mise Ă jour backend
- Les listes semblent vides parce quâun champ a Ă©tĂ© renommĂ© ou dĂ©placĂ©
- Lâapp plante en lisant une valeur manquante
- Les paiements échouent parce que la validation est plus stricte
- Des fonctionnalités disparaissent silencieusement parce que la forme de la réponse a changé
Le but du versioning est simple : continuer Ă amĂ©liorer le serveur sans forcer tout le monde Ă mettre Ă jour immĂ©diatement. Traitez votre API comme un contrat de long terme. Les nouvelles versions de lâapp doivent fonctionner avec le comportement serveur neuf, et les versions plus anciennes doivent rester opĂ©rationnelles assez longtemps pour respecter les cycles de mise Ă jour rĂ©els.
Pour la plupart des applications grand public, attendez-vous Ă supporter plusieurs versions dâapp en parallĂšle. Les apps internes peuvent parfois aller plus vite, mais ce nâest rarement instantanĂ©. Planifier le chevauchement Ă©vite que chaque release backend ne devienne un pic de support.
Ce que signifie « compatible » pour un contrat dâAPI
Un contrat dâAPI est la promesse entre votre app mobile et votre serveur : quelle URL appeler, quelles entrĂ©es sont acceptĂ©es, Ă quoi ressemble la rĂ©ponse et que signifie chaque champ. Quand lâapp dĂ©pend de cette promesse et que le serveur la modifie, les utilisateurs le ressentent sous forme de plantages, donnĂ©es manquantes ou fonctionnalitĂ©s qui cessent de fonctionner.
Un changement est compatible quand les anciennes versions de lâapp peuvent continuer Ă utiliser lâAPI sans changer de code. ConcrĂštement, cela signifie que le serveur comprend toujours ce que les anciennes apps envoient et renvoie des rĂ©ponses que ces apps peuvent parser.
Une façon rapide de séparer les changements sûrs des changements risqués :
- Breaking changes : suppression ou renommage dâun champ, changement de type (nombre â chaĂźne), rendre un champ optionnel obligatoire, changer le format dâerreur, durcir la validation de façon que les anciennes apps ne satisfassent plus.
- Changements gĂ©nĂ©ralement sĂ»rs : ajout dâun nouveau champ optionnel, ajout dâun nouvel endpoint, accepter dâancien et nouveau formats de requĂȘte, ajouter des valeurs dâĂ©numĂ©ration (seulement si lâapp traite les valeurs inconnues comme « autre »).
La compatibilitĂ© nĂ©cessite aussi un plan de fin de vie. Retirer un comportement ancien est acceptable, mais cela doit ĂȘtre programmĂ© (par exemple « conserver v1 pendant 90 jours aprĂšs le lancement de v2 ») afin dâĂ©voluer sans surprendre les utilisateurs.
Approches courantes de versioning et compromis
Le versioning vise à offrir aux builds plus anciennes un contrat stable pendant que vous avancez. Il existe plusieurs approches courantes, chacune déplaçant la complexité ailleurs.
Versioning dans lâURL
Mettre la version dans le chemin (par exemple /v1/ et /v2/) est le plus simple Ă voir et Ă dĂ©boguer. Cela fonctionne bien avec le cache, le logging et le routage parce que la version fait partie de lâURL. Le revers est que les Ă©quipes peuvent finir par maintenir des handlers parallĂšles plus longtemps que prĂ©vu, mĂȘme quand la diffĂ©rence est minime.
Versioning via les en-tĂȘtes
Avec le versioning par en-tĂȘte, le client envoie une version dans un header (par exemple un Accept ou un header personnalisĂ©). Les URLs restent propres et vous pouvez faire Ă©voluer lâAPI sans changer chaque chemin. LâinconvĂ©nient est la visibilité : les proxys, les logs et les humains ratent souvent la version Ă moins dâĂȘtre vigilants, et les clients mobiles doivent dĂ©finir lâen-tĂȘte de façon fiable sur chaque requĂȘte.
Versioning via paramĂštre de requĂȘte
Le versioning par paramĂštre (comme ?v=2) semble simple, mais devient vite bordĂ©lique. Les paramĂštres se retrouvent dans des bookmarks, outils dâanalyse et scripts, et vous pouvez vous retrouver avec plusieurs « versions » flottantes sans propriĂ©tĂ© claire.
Si vous voulez une comparaison simple :
- Versioning URL : le plus facile à inspecter, mais peut créer des APIs parallÚles qui vivent longtemps
- Versioning header : URLs propres, mais plus difficile à dépanner
- Versioning query : rapide à démarrer, facile à mal utiliser
Les feature flags sont un autre outil. Ils permettent de changer le comportement derriĂšre le mĂȘme contrat (par exemple un nouvel algorithme de classement) sans crĂ©er une nouvelle version dâAPI. Ils ne remplacent pas le versioning quand la forme des requĂȘtes ou des rĂ©ponses doit changer.
Choisissez une approche et tenez-vous-y. La cohérence compte plus que le choix « parfait ».
RÚgles pratiques pour les changements rétrocompatibles
La mentalitĂ© la plus sĂ»re : les clients plus anciens doivent continuer Ă fonctionner mĂȘme sâils nâapprennent jamais votre nouvelle fonctionnalitĂ©. Cela signifie gĂ©nĂ©ralement ajouter des choses, pas changer ce qui existe dĂ©jĂ .
PrivilĂ©giez les changements additifs : nouveaux champs, nouveaux endpoints, nouveaux paramĂštres optionnels. Quand vous ajoutez quelque chose, rendez-le vraiment optionnel cĂŽtĂ© serveur. Si une ancienne app ne lâenvoie pas, le serveur doit se comporter exactement comme avant.
Quelques habitudes évitent la plupart des régressions :
- Ajoutez des champs, mais ne changez pas le type ou le sens des champs existants.
- Traitez les entrées manquantes comme normales et utilisez des valeurs par défaut sensées.
- Ignorez les champs de requĂȘte inconnus pour que anciens et nouveaux clients coexistent.
- Gardez le format des erreurs stable. Si vous devez le changer, versionnez le payload dâerreur.
- Si le comportement doit changer, introduisez un nouvel endpoint ou une nouvelle version plutĂŽt quâun « tweak » silencieux.
Ăvitez de changer la signification dâun champ existant sans incrĂ©ment de version. Par exemple, si status=1 signifiait « payé » et que vous le rĂ©utilisez pour « autorisé », les anciennes apps prendront de mauvaises dĂ©cisions et vous pourriez ne pas le remarquer avant les plaintes.
Les renommages et suppressions exigent un plan. Le schĂ©ma le plus sĂ»r est de garder lâancien champ et dâajouter le nouveau en parallĂšle un certain temps. Renseignez les deux dans les rĂ©ponses, acceptez les deux dans les requĂȘtes et loggez qui utilise encore lâancien champ. Supprimez lâancien champ seulement aprĂšs la fenĂȘtre de dĂ©prĂ©ciation.
Une petite habitude puissante : quand vous introduisez une nouvelle rĂšgle mĂ©tier requise, ne demandez pas au client de la prendre en charge dĂšs le premier jour. Appliquez la rĂšgle cĂŽtĂ© serveur avec une valeur par dĂ©faut dâabord, puis exigez que le client envoie la nouvelle valeur quand la majoritĂ© des utilisateurs sera mise Ă jour.
Définir une politique simple de versioning et de dépréciation
Le versioning marche mieux quand les rÚgles sont ennuyeuses et écrites. Gardez la politique assez courte pour que produit, mobile et backend la suivent vraiment.
Commencez par des fenĂȘtres de support. DĂ©cidez combien de temps vous garderez dâanciennes versions dâAPI actives aprĂšs la sortie dâune nouvelle (par exemple 6â12 mois), plus des exceptions (sĂ©curitĂ©, obligations lĂ©gales).
Ensuite, dĂ©finissez comment vous prĂ©venez les clients avant de les casser. Choisissez un signal de dĂ©prĂ©ciation et utilisez-le partout. Options courantes : un en-tĂȘte de rĂ©ponse Deprecation: true avec une date de retrait, ou un champ JSON comme "deprecation": {"will_stop_working_on": "2026-04-01"} sur certaines rĂ©ponses. Lâimportant est la cohĂ©rence : les clients peuvent le dĂ©tecter, les tableaux de bord le rapporter, et le support lâexpliquer.
DĂ©finissez une version minimale dâapp supportĂ©e et soyez explicite sur lâapplication de cette rĂšgle. Ăvitez les blocages surprises. Une approche pratique :
- Retourner un avertissement doux (par exemple un champ qui dĂ©clenche une invite de mise Ă jour dans lâapp).
- Nâappliquer une restriction quâaprĂšs un dĂ©lai communiquĂ©.
Si vous bloquez les requĂȘtes, retournez un payload dâerreur clair avec un message humain et un code machine lisible.
Enfin, décidez qui peut approuver les breaking changes et quelle documentation est requise. Gardez-le simple :
- Un propriétaire approuve les breaking changes.
- Une note de changement courte explique ce qui a changé, qui est affecté et le chemin de migration.
- Un plan de test inclut au moins une ancienne version dâapp.
- Une date de retrait est fixée au début de la dépréciation.
Plan de déploiement étape par étape qui garde les anciennes apps fonctionnelles
Les utilisateurs mobiles ne mettent pas tous Ă jour le mĂȘme jour. Lâapproche la plus sĂ»re est de publier une nouvelle API tout en laissant lâancienne intacte, puis transfĂ©rer le trafic progressivement.
Dâabord, dĂ©finissez ce que fait v2 et verrouillez le comportement de v1. Traitez v1 comme une promesse : mĂȘmes champs, mĂȘmes sens, mĂȘmes codes dâerreur. Si v2 nĂ©cessite une forme de rĂ©ponse diffĂ©rente, ne modifiez pas v1 pour quâelle corresponde.
Ensuite, exĂ©cutez v2 en parallĂšle. Cela peut signifier des routes sĂ©parĂ©es (comme /v1/... et /v2/...) ou des handlers sĂ©parĂ©s derriĂšre la mĂȘme gateway. Conservez la logique partagĂ©e Ă un seul endroit, mais gardez le contrat sĂ©parĂ© pour quâun refactor v2 ne change pas accidentellement v1.
Puis mettez Ă jour lâapp mobile pour prĂ©fĂ©rer v2. ImplĂ©mentez un fallback simple : si v2 renvoie "not supported" (ou une autre erreur connue), retenter en v1. Cela aide pendant les releases progressives et quand les rĂ©seaux rĂ©els deviennent compliquĂ©s.
AprĂšs la sortie de lâapp, surveillez lâadoption et les erreurs. VĂ©rifications utiles :
- volume de requĂȘtes v1 vs v2 par version dâapp
- taux dâerreur et latence pour v2
- Ă©checs dâanalyse de rĂ©ponse
- plantages liés aux écrans réseau
Quand v2 est stable, ajoutez des avertissements de dĂ©prĂ©ciation clairs pour v1 et communiquez un calendrier. Retirez v1 seulement quand lâusage passe sous un seuil acceptable (par exemple <1â2% pendant plusieurs semaines).
Exemple : vous changez GET /orders pour supporter le filtrage et de nouveaux statuts. v2 ajoute status_details tandis que v1 reste identique. La nouvelle app appelle v2, mais si elle tombe sur un cas limite elle retombe sur v1 et affiche toujours la liste des commandes.
Conseils dâimplĂ©mentation cĂŽtĂ© serveur
La plupart des rĂ©gressions pendant les rollouts surviennent parce que la gestion des versions est dispersĂ©e dans les contrĂŽleurs, helpers et le code de base de donnĂ©es. Gardez la dĂ©cision « quelle version pour cette requĂȘte ? » en un seul endroit, et le reste du code doit rester prĂ©visible.
Placez le routage de version derriĂšre une seule porte
Choisissez un signal (segment dâURL, header, ou numĂ©ro de build de lâapp) et normalisez-le tĂŽt. Routez vers le bon handler dans un module ou middleware unique pour que chaque requĂȘte suive le mĂȘme chemin.
Un pattern pratique :
- Parsez la version une fois (et loggez-la).
- Mappez la version Ă un handler (v1, v2, ...) dans un registre unique.
- Gardez les utilitaires partagĂ©s agnostiques de version (parsing de date, vĂ©rifications dâauth), pas la logique de forme de rĂ©ponse.
Faites attention au partage de code entre versions. Corriger un bug v2 dans du code « partagé » peut changer accidentellement le comportement v1. Si la logique affecte les champs de sortie ou les rÚgles de validation, gardez-la versionnée ou couvrez-la par des tests spécifiques à la version.
Gardez les changements de données compatibles pendant le rollout
Les migrations de base doivent fonctionner pour les deux versions en mĂȘme temps. Ajoutez dâabord des colonnes, backfillez si nĂ©cessaire, puis supprimez ou resserrez les contraintes plus tard. Ăvitez de renommer ou de changer la sĂ©mantique en plein rollout. Si vous devez supporter deux formats, Ă©crivez les deux formats pendant une courte pĂ©riode jusquâĂ ce que la majoritĂ© des clients migre.
Rendez les erreurs prĂ©visibles. Les anciennes apps interprĂštent souvent les erreurs inconnues comme « quelque chose sâest mal passé ». Utilisez des status codes cohĂ©rents, des identifiants dâerreur stables et des messages courts qui aident le client Ă dĂ©cider (rĂ©essayer, se rĂ©authentifier, inviter Ă mettre Ă jour).
Enfin, protĂ©gez-vous contre les champs manquants que les anciennes apps nâenvoient pas. Utilisez des valeurs par dĂ©faut sĂ»res et validez avec des dĂ©tails dâerreur clairs et stables.
Considérations cÎté mobile qui affectent le versioning
Puisque les utilisateurs peuvent rester sur une ancienne build pendant des semaines, le versioning doit supposer que plusieurs versions clientes toucheront vos serveurs en mĂȘme temps.
Un gros avantage est la tolĂ©rance cĂŽtĂ© client. Si lâapp plante ou nâarrive pas Ă parser quand le serveur ajoute un champ, vous verrez des bugs « alĂ©atoires » de rollout.
- Ignorez les champs JSON inconnus.
- Traitez les champs manquants comme normaux et utilisez des valeurs par défaut.
- Gérez les nulls sans planter (les champs peuvent devenir nullables pendant des migrations).
- Ne dĂ©pendez pas de lâordre des tableaux sauf si le contrat le garantit.
- Gardez le traitement des erreurs convivial (un Ă©tat de rĂ©essai vaut mieux quâun Ă©cran vide).
Le comportement réseau compte aussi. Pendant un rollout vous pouvez avoir briÚvement des versions de serveurs mixtes derriÚre des load balancers ou caches, et les réseaux mobiles amplifient les petits soucis.
Choisissez des rĂšgles claires de timeout et retry : timeouts courts pour les lectures, un peu plus longs pour les uploads, et des retries limitĂ©s avec backoff. Rendre lâidempotence standard pour les appels de crĂ©ation ou de paiement Ă©vite les doubles envois lors dâun retry.
Les changements dâauth sont la maniĂšre la plus rapide dâexclure les anciennes apps. Si vous changez le format du token, les scopes requis ou les rĂšgles de session, gardez une fenĂȘtre de chevauchement oĂč anciens et nouveaux tokens sont acceptĂ©s. Si vous devez faire une rotation de clĂ©s ou de claims, planifiez une migration progressive, pas une coupure le mĂȘme jour.
Envoyez les mĂ©tadonnĂ©es de lâapp avec chaque requĂȘte (par exemple version dâapp et plateforme). Cela facilite le retour dâavertissements ciblĂ©s sans forker lâAPI entiĂšre.
Surveillance et rollouts progressifs sans surprises
Un dĂ©ploiement progressif ne fonctionne que si vous voyez ce que font les diffĂ©rentes versions dâapp. Le but est simple : savoir qui est encore sur dâanciens endpoints et dĂ©tecter les problĂšmes avant quâils nâaffectent tout le monde.
Commencez par suivre lâusage par version dâAPI chaque jour. Ne comptez pas seulement les requĂȘtes totales. Suivez les appareils actifs et segmentez les endpoints clĂ©s comme login, profil et paiements. Cela vous indique si une ancienne version est toujours « vivante » mĂȘme si le trafic total semble faible.
Ensuite surveillez les erreurs par version et par type. Une hausse des 4xx indique souvent un dĂ©calage de contrat (champ requis changĂ©, valeurs dâĂ©numĂ©ration dĂ©placĂ©es, rĂšgles dâauth plus strictes). Une hausse des 5xx pointe souvent vers des rĂ©gressions serveur (mauvais dĂ©ploiement, requĂȘtes lentes, dĂ©faillance dâun dĂ©pendance). Voir les deux par version aide Ă choisir la bonne action rapidement.
Utilisez des rollouts par Ă©tapes dans les stores pour limiter la zone dâimpact. Augmentez lâexposition par paliers et observez les mĂȘmes tableaux aprĂšs chaque Ă©tape (par ex. 5%, 25%, 50%). Si la nouvelle version montre des problĂšmes, arrĂȘtez le rollout avant une panne gĂ©nĂ©rale.
Ayez des dĂ©clencheurs de rollback Ă©crits Ă lâavance, pas dĂ©cidĂ©s pendant lâincident. DĂ©clencheurs frĂ©quents :
- taux dâerreur au-dessus dâun seuil fixe pendant 15â30 minutes
- baisse du taux de connexion (ou augmentation des échecs de refresh token)
- hausse des échecs de paiement (ou allongement des timeouts du checkout)
- pic de tickets support lié à une version précise
- augmentation de la latence sur un endpoint critique
Gardez un petit playbook dâincident pour les pannes liĂ©es aux versions : qui pager, comment dĂ©sactiver un flag risquĂ©, quelle release serveur rollbacker, et comment prolonger la fenĂȘtre de dĂ©prĂ©ciation si des clients anciens sont toujours actifs.
Exemple : faire Ă©voluer un endpoint lors dâune release rĂ©elle
Le checkout est un changement classique en production. Vous commencez avec un flux simple, puis vous ajoutez une étape de paiement (authentification plus forte) et renommez des champs pour coller au vocabulaire métier.
Supposons que votre app mobile appelle POST /checkout.
Ce qui reste en v1 vs ce qui change en v2
En v1, conservez la requĂȘte et le comportement existants pour que les anciennes builds puissent finir les paiements sans surprise. En v2, introduisez le nouveau flux et des noms plus propres.
- v1 conserve :
amount,currency,card_token, et une réponse unique commestatus=paid|failed. - v2 ajoute :
payment_method_id(remplaçantcard_token) et un champnext_actionpour que lâapp gĂšre une Ă©tape supplĂ©mentaire (vĂ©rifier, rĂ©essayer, rediriger). - v2 renomme :
amountentotal_amountetcurrencyenbilling_currency.
Les anciennes apps continuent de fonctionner parce que le serveur applique des valeurs par dĂ©faut sĂ»res. Si une requĂȘte v1 ne connaĂźt pas next_action, le serveur complĂšte le paiement quand câest possible et renvoie le rĂ©sultat au format v1. Si la nouvelle Ă©tape est requise, v1 reçoit un code dâerreur clair et stable comme requires_update au lieu dâun Ă©chec gĂ©nĂ©rique confus.
Adoption, retrait et rollback
Suivez lâadoption par version : part des appels checkout sur v2, taux dâerreur, et combien dâutilisateurs tournent encore sur des builds qui ne prennent en charge que v1. Quand lâusage de v2 est constamment Ă©levĂ© (par ex. â„95% plusieurs semaines) et que lâusage de v1 est faible, fixez une date de retrait de v1 et communiquez-la (notes de release, messages in-app).
Si quelque chose se passe mal aprĂšs le lancement, le rollback doit ĂȘtre banal :
- Orientez plus de trafic vers le comportement v1.
- DĂ©sactivez lâĂ©tape de paiement nouvelle via un flag serveur.
- Continuez dâaccepter les deux jeux de champs et loggez ce que vous avez auto-converti.
Erreurs fréquentes qui provoquent des ruptures silencieuses
La plupart des pannes mobiles ne font pas de bruit. La requĂȘte rĂ©ussit, lâapp tourne, mais les utilisateurs voient des donnĂ©es manquantes, des totaux erronĂ©s ou des boutons inactifs. Ces problĂšmes sont difficiles Ă repĂ©rer car ils frappent souvent des versions dâapp anciennes pendant un rollout progressif.
Causes courantes :
- Changer ou supprimer des champs (ou leur type) sans plan de version clair.
- Rendre un nouveau champ de requĂȘte immĂ©diatement obligatoire, si bien que les anciennes apps sont rejetĂ©es.
- Publier une migration de base de données qui suppose que seule la nouvelle app existe.
- Retirer v1 en se basant sur les installations plutĂŽt que lâusage actif.
- Oublier les jobs background et webhooks qui envoient encore de vieux payloads.
Un exemple concret : votre champ de rĂ©ponse total Ă©tait une chaĂźne ("12.50") et vous le transformez en nombre (12.5). Les nouvelles apps vont bien. Les anciennes peuvent le traiter comme zĂ©ro, le cacher, ou planter seulement sur certains Ă©crans. Sans surveillance des erreurs par version dâapp, cela peut passer inaperçu.
Checklist rapide et prochaines étapes
Le versioning porte moins sur le nom des endpoints que sur la rĂ©pĂ©tition des mĂȘmes contrĂŽles de sĂ©curitĂ© Ă chaque release.
Vérifications rapides avant la release
- Favorisez les changements additifs. Ne supprimez pas ou ne renommez pas les champs que les anciennes apps lisent.
- Fournissez des valeurs par défaut sûres pour que les champs nouveaux manquants se comportent comme avant.
- Gardez les rĂ©ponses dâerreur stables (status + forme + signification).
- Traitez les enums avec soin et ne changez pas la signification dâune valeur existante.
- Rejouez quelques requĂȘtes rĂ©elles dâanciennes versions dâapp et confirmez que les rĂ©ponses se parsĂšment toujours.
Vérifications rapides pendant le rollout et avant le retrait
- Suivez lâadoption par version dâapp. Vous voulez une courbe claire de v1 vers v2, pas une ligne plate.
- Surveillez les taux dâerreur par version. Un pic indique souvent un problĂšme de parsing ou validation pour les anciens clients.
- Corrigez dâabord le endpoint le plus dĂ©faillant, puis Ă©largissez le rollout.
- Retirez seulement quand lâusage actif est vraiment faible, et communiquez la date.
- Supprimez le code de fallback en dernier, aprĂšs la fenĂȘtre de dĂ©prĂ©ciation.
RĂ©digez votre politique de versioning et de dĂ©prĂ©ciation sur une seule page, puis transformez la checklist en une gate de release que lâĂ©quipe suit Ă chaque fois.
Si vous construisez des outils internes ou des apps client avec une plateforme no-code, cela reste utile de traiter lâAPI comme un contrat avec une fenĂȘtre de dĂ©prĂ©ciation claire. Pour les Ă©quipes utilisant AppMaster (appmaster.io), garder v1 et v2 cĂŽte Ă cĂŽte est souvent plus simple car vous pouvez rĂ©gĂ©nĂ©rer backend et clients au fur et Ă mesure tout en maintenant les anciens contrats pendant le rollout.
FAQ
Les utilisateurs mobiles ne mettent pas tous lâapp Ă jour en mĂȘme temps, donc des versions plus anciennes continuent dâappeler votre backend aprĂšs un dĂ©ploiement. Si vous changez un endpoint, la validation ou la forme de la rĂ©ponse, ces anciennes versions ne peuvent pas sâadapter et elles Ă©chouent, avec des symptĂŽmes comme des Ă©crans vides, des plantages ou des paiements qui nâaboutissent pas.
« Compatible » signifie quâune application plus ancienne peut continuer Ă faire les mĂȘmes requĂȘtes et recevoir des rĂ©ponses quâelle sait analyser et utiliser correctement, sans modification du code. Le modĂšle mental simple : lâAPI est un contrat ; vous pouvez ajouter des capacitĂ©s, mais ne changez pas la signification des champs et comportements existants pour les clients actuels.
Un changement est bloquant quand il modifie quelque chose dont une app existante dĂ©pend : suppression ou renommage de champs, changement de type, validation plus stricte qui rejette dâanciennes requĂȘtes, ou modification du format dâerreur. Si une ancienne app ne peut plus parser la rĂ©ponse ou satisfaire les rĂšgles de la requĂȘte, câest une rupture, mĂȘme si le serveur semble « fonctionner ».
Le versioning dans lâURL est souvent le choix par dĂ©faut parce que la version est visible dans les logs, les outils de debug et le routage ; il est difficile dâoublier de lâenvoyer. Le versioning par header marche aussi, mais il est plus facile Ă rater lors du dĂ©pannage et oblige chaque requĂȘte cliente Ă dĂ©finir correctement lâen-tĂȘte.
Choisissez une fenĂȘtre de support claire qui correspond au comportement rĂ©el de mise Ă jour mobile, et tenez-vous-y : beaucoup dâĂ©quipes choisissent des mois plutĂŽt que des jours. Lâessentiel est dâavoir une date de retrait publiĂ©e et de mesurer lâusage actif pour ne pas deviner quand il est sĂ»r dâarrĂȘter une ancienne version.
Utilisez un signal de dĂ©prĂ©ciation cohĂ©rent et unique pour que les clients et les tableaux de bord puissent le dĂ©tecter de façon fiable, par exemple un en-tĂȘte de rĂ©ponse stable ou un petit champ JSON contenant la date de retrait. Restez simple et prĂ©visible pour que le support et les Ă©quipes produit puissent lâexpliquer facilement.
Favorisez les changements additifs : ajoutez des champs optionnels ou de nouveaux endpoints, et conservez les anciens champs avec la mĂȘme signification. Pour un renommage, gardez les deux champs en parallĂšle pendant un temps et remplissez les deux pour que les anciennes apps ne perdent pas de donnĂ©es pendant que les nouvelles passent au nouveau champ.
Concevez les migrations pour que les deux versions dâAPI fonctionnent simultanĂ©ment : ajoutez dâabord des colonnes, backfillez si nĂ©cessaire, puis resserrez les contraintes ou supprimez dâanciens champs plus tard. Ăvitez de renommer ou de changer la sĂ©mantique au milieu dâun dĂ©ploiement, sinon une version Ă©crira des donnĂ©es que lâautre ne pourra pas lire.
Rendez lâapp cliente tolĂ©rante : ignorez les champs JSON inconnus, traitez les champs manquants comme normaux avec des valeurs par dĂ©faut sĂ»res, et gĂ©rez les nulls sans planter. Cela rĂ©duit les bugs « alĂ©atoires » pendant les dĂ©ploiements oĂč le serveur ajoute des champs ou les rĂ©ponses varient temporairement.
Surveillez lâusage et les erreurs par version dâAPI et par version dâapp, en particulier pour les endpoints critiques comme lâauthentification et les paiements. Ălargissez les dĂ©ploiements progressifs uniquement lorsque les donnĂ©es sont stables. Un plan sĂ»r verrouille le comportement v1, exĂ©cute v2 en parallĂšle et migre les clients progressivement avec des stratĂ©gies de fallback claires jusquâĂ ce que lâadoption permette de retirer v1 en toute confiance.


