Una cosa che ritengo sia cruciale per una strategia di versioning di successo è quella di separare molto chiaramente il controllo di versione delle strutture di dati nei tuoi payload e il controllo di versione delle operazioni di cui hai bisogno. Se confonderai queste due cose, tenderai a trovare un approccio incoerente.
Ad esempio, supponiamo che tu abbia creato un'API con endpoint:
.../<employee>/management
e l'output di dati contiene questo:
"manager": "Boss Hog"
Ora all'improvviso ti viene detto che l'organizzazione si sta spostando verso la gestione di matrici * e devi supportare questo nella tua API. Quindi modifichi il formato dei dati:
"managers": [
{"manager": "Boss Hog", "type": "boss"},
{"manager": "Rosco Pico Train", "type": "sheriff"}
]
Non rimanere impigliato nella struttura o in che modo potresti modificarlo in modo irrinunciabile. supponiamo solo per questo esempio che devi modificare la struttura in modo che alcuni client non possano gestire senza modifiche.
Si noti che l'URI per questo è sempre lo stesso. Questo è davvero cruciale perché REST (HTTP) fornisce una bella funzionalità che ti permette di supportare questo usando i tipi mime personalizzati. Ciò significa che i tuoi payload possono evolvere nel tempo mentre gli URI sono stabili.
Ora, se hai bisogno di cambiare le strutture URI, è qui che entra in gioco la tua versione di URI. Per la tua sanità mentale, ti suggerisco di fare una versione dell'intera cosa, anche se viene fatta solo una piccola modifica. Detto questo, probabilmente non vorrai preoccuparti di provare a supportare più strategie di mappatura URI nello stesso codice. Inserendo il numero di versione in precedenza nel percorso, semplifica la distribuzione di questi separatamente e utilizza un proxy inverso per risolvere le cose.
* Non sostengo la gestione delle matrici.