Questa è una domanda buona e difficile. L'argomento della progettazione di URI è allo stesso tempo la parte più importante di un'API REST e , pertanto, un impegno potenzialmente a lungo termine nei confronti degli utenti di tale API .
Poiché l'evoluzione di un'applicazione e, in misura minore, la sua API è un dato di fatto e che è persino simile all'evoluzione di un prodotto apparentemente complesso come un linguaggio di programmazione, il design dell'URI dovrebbe avere meno vincoli naturali e dovrebbe essere preservato nel tempo . Maggiore è la durata dell'applicazione e dell'API, maggiore è l'impegno per gli utenti dell'applicazione e dell'API.
D'altra parte, un altro fatto della vita è che è difficile prevedere tutte le risorse e i loro aspetti che verrebbero consumati attraverso l'API. Fortunatamente, non è necessario progettare l'intera API che verrà utilizzata fino al Apocalypse . È sufficiente definire correttamente tutti gli end-point e lo schema di indirizzamento di ogni risorsa e istanza di risorsa.
Nel tempo potrebbe essere necessario aggiungere nuove risorse e nuovi attributi a ciascuna particolare risorsa, ma il metodo che gli utenti API seguono per accedere a una particolare risorsa non dovrebbe cambiare una volta che uno schema di indirizzamento delle risorse diventa pubblico e quindi definitivo.
Questo metodo si applica alla semantica del verbo HTTP (ad es. PUT dovrebbe sempre aggiornare / sostituire) e ai codici di stato HTTP supportati nelle versioni precedenti dell'API (dovrebbero continuare a funzionare in modo che i client API che hanno funzionato senza intervento umano siano in grado di continuare a funzionare come quello).
Inoltre, poiché l'incorporazione della versione dell'API nell'URI interromperebbe il concetto di hypermedia come motore dello stato dell'applicazione (dichiarato nella tesi di dottorato di Roy T. Fieldings) avendo un indirizzo / URI di risorsa che cambierebbe nel tempo, concluderei che l' API le versioni non devono essere mantenute a lungo negli URI delle risorse, il che significa che gli URI delle risorse su cui gli utenti API possono fare affidamento dovrebbero essere permalink .
Certo, è possibile incorporare la versione API nell'URI di base ma solo per usi ragionevoli e limitati come il debug di un client API che funziona con la nuova versione dell'API. Tali API con versione devono essere limitate nel tempo e disponibili solo per gruppi limitati di utenti API (come durante le beta chiuse). Altrimenti, ti impegni dove non dovresti.
Un paio di pensieri riguardanti la manutenzione delle versioni API che hanno una data di scadenza. Tutte le piattaforme / i linguaggi di programmazione comunemente utilizzati per implementare i servizi Web (Java, .NET, PHP, Perl, Rails, ecc.) Consentono un facile collegamento degli endpoint dei servizi Web a un URI di base. In questo modo è facile raccogliere e mantenere una raccolta di file / classi / metodi separati tra le diverse versioni dell'API .
Dal punto di vista degli utenti API, è anche più facile lavorare e associarsi a una particolare versione dell'API quando è ovvio ma solo per un tempo limitato, cioè durante lo sviluppo.
Dal POV del manutentore dell'API, è più semplice mantenere in parallelo diverse versioni dell'API utilizzando sistemi di controllo del codice sorgente che funzionano principalmente sui file come la più piccola unità di controllo delle versioni (codice sorgente).
Tuttavia, con le versioni API chiaramente visibili nell'URI c'è un avvertimento: si potrebbe anche obiettare questo approccio poiché la storia dell'API diventa visibile / corrispondente nella progettazione dell'URI e quindi è soggetta a cambiamenti nel tempo che vanno contro le linee guida di REST. Sono d'accordo!
Il modo per aggirare questa ragionevole obiezione è implementare l'ultima versione dell'API con l'URI di base dell'API senza versione. In questo caso, gli sviluppatori di client API possono scegliere di:
sviluppare rispetto a quello più recente (impegnandosi a mantenere l'applicazione proteggendola da eventuali modifiche all'API che potrebbero interrompere il client API mal progettato ).
associare a una versione specifica dell'API (che diventa evidente) ma solo per un tempo limitato
Ad esempio, se API v3.0 è l'ultima versione dell'API, i seguenti due dovrebbero essere alias (ovvero comportarsi in modo identico a tutte le richieste API):
http: // shonzilla / api / customers / 1234
http: // shonzilla / api /v3.0 / customers / 1234
http: // shonzilla / api / v3 / customers / 1234
Inoltre, i client API che tentano ancora di puntare alla vecchia API devono essere informati per utilizzare l'ultima versione dell'API precedente, se la versione dell'API che stanno utilizzando è obsoleta o non più supportata . Quindi accedere a uno qualsiasi degli URI obsoleti come questi:
http: // shonzilla / api /v2.2 / customers / 1234
http: // shonzilla / api /v2.0 / customers / 1234
http: // shonzilla / api / v2 / customers / 1234
http: // shonzilla / api /v1.1 / customers / 1234
http: // shonzilla / api / v1 / customers / 1234
dovrebbe restituire uno qualsiasi dei 30x codici di stato HTTP che indicano il reindirizzamento utilizzato insieme aLocation
HTTP che reindirizza alla versione appropriata dell'URI della risorsa che rimane questa:
http: // shonzilla / api / clienti / 1234
Esistono almeno due codici di stato HTTP di reindirizzamento appropriati per gli scenari di versione delle API:
301 Spostato in modo permanente indicando che la risorsa con un URI richiesto viene spostata permanentemente in un altro URI (che dovrebbe essere un permalink di istanza di risorsa che non contiene informazioni sulla versione dell'API). Questo codice di stato può essere utilizzato per indicare una versione API obsoleta / non supportata, informando il client API che un URI di risorse con versione è stato sostituito da un permalink di risorse .
302 trovati che indica che la risorsa richiesta si trova temporaneamente in un'altra posizione, mentre l'URI richiesto potrebbe ancora essere supportato. Questo codice di stato può essere utile quando gli URI senza versione sono temporaneamente non disponibili e che una richiesta deve essere ripetuta utilizzando l'indirizzo di reindirizzamento (ad es. Puntando all'URI con la versione APi incorporata) e vogliamo dire ai clienti di continuare a usarlo (ad es. permalink).
altri scenari sono disponibili nel capitolo Redirection 3xx della specifica HTTP 1.1