Ho letto le strategie di controllo delle versioni per le API ReST e qualcosa che nessuno di loro sembra affrontare è il modo in cui gestisci la base di codice sottostante.
Supponiamo che stiamo apportando una serie di modifiche sostanziali a un'API, ad esempio, cambiando la nostra risorsa Cliente in modo che restituisca campi forename
e separati surname
invece di un singolo name
campo. (Per questo esempio, userò la soluzione di controllo delle versioni URL poiché è facile comprendere i concetti coinvolti, ma la domanda è ugualmente applicabile alla negoziazione del contenuto o alle intestazioni HTTP personalizzate)
Ora abbiamo un endpoint in http://api.mycompany.com/v1/customers/{id}
e un altro endpoint incompatibile in http://api.mycompany.com/v2/customers/{id}
. Stiamo ancora rilasciando correzioni di bug e aggiornamenti di sicurezza per l'API v1, ma lo sviluppo di nuove funzionalità è ora incentrato sulla v2. Come scriviamo, testiamo e distribuiamo le modifiche al nostro server API? Posso vedere almeno due soluzioni:
Utilizzare un tag / ramo di controllo del codice sorgente per la base di codice v1. v1 e v2 sono sviluppate e distribuite in modo indipendente, con unioni di controllo di revisione utilizzate secondo necessità per applicare la stessa correzione di bug a entrambe le versioni, in modo simile a come gestireste le basi di codice per le app native quando sviluppate una nuova versione principale pur supportando la versione precedente.
Rendi la codebase stessa a conoscenza delle versioni API, in modo da ottenere una singola codebase che include sia la rappresentazione del cliente v1 che la rappresentazione del cliente v2. Considera il controllo delle versioni come parte dell'architettura della tua soluzione invece che come un problema di distribuzione, probabilmente utilizzando una combinazione di spazi dei nomi e instradamento per assicurarti che le richieste siano gestite dalla versione corretta.
L'ovvio vantaggio del modello di filiale è che è banale eliminare le vecchie versioni dell'API - basta smettere di distribuire il ramo / tag appropriato - ma se si eseguono più versioni, si potrebbe finire con una struttura di ramo e una pipeline di distribuzione davvero contorta. Il modello "base di codice unificata" evita questo problema, ma (credo?) Renderebbe molto più difficile rimuovere le risorse e gli endpoint deprecati dalla base di codice quando non sono più necessari. So che questo è probabilmente soggettivo poiché è improbabile che ci sia una risposta semplice e corretta, ma sono curioso di capire come le organizzazioni che mantengono API complesse su più versioni risolvono questo problema.