Das ist eine gute und eine schwierige Frage. Das Thema der URI-Design ist zur gleichen Zeit der wichtigste Teil einer REST-API und daher ein potenzielles langfristiges Engagement gegenüber den Nutzern dieser API .
Da die Entwicklung einer Anwendung und, in geringerem Maße, ihrer API eine Tatsache des Lebens ist und sogar mit der Entwicklung eines scheinbar komplexen Produkts wie einer Programmiersprache vergleichbar ist, ist die URI-Entwurf weniger haben sollte natürliche Beschränkungen und es im Laufe der Zeit bewahrt werden sollten . Je länger die Lebensdauer der Anwendung und der API ist, desto größer ist die Verpflichtung gegenüber den Nutzern der Anwendung und der API.
Andererseits ist es auch eine Tatsache, dass es schwierig ist, alle Ressourcen und ihre Aspekte, die über die API verbraucht werden, vorherzusehen. Glücklicherweise ist es nicht notwendig, die gesamte API zu entwerfen, die bis zum Ende der Laufzeit verwendet werden soll. Apokalypse . Es reicht aus, alle Ressourcenendpunkte und das Adressierungsschema jeder Ressource und Ressourceninstanz korrekt zu definieren.
Im Laufe der Zeit müssen Sie möglicherweise neue Ressourcen und neue Attribute zu jeder einzelnen Ressource hinzufügen, aber die Methode, mit der API-Benutzer auf eine bestimmte Ressource zugreifen, sollte sich nicht mehr ändern, sobald ein Ressourcenadressierungsschema öffentlich und damit endgültig wird.
Diese Methode gilt für die Semantik von HTTP-Verben (z. B. sollte PUT immer aktualisieren/ersetzen) und HTTP-Statuscodes, die in früheren API-Versionen unterstützt werden (sie sollten weiterhin funktionieren, damit API-Clients, die ohne menschliches Eingreifen funktioniert haben, auch weiterhin so arbeiten können).
Da die Einbettung der API-Version in den URI außerdem das Konzept der Hypermedia als Motor des Anwendungsstatus (in Roy T. Fieldings Dissertation) durch eine Ressourcenadresse/URI, die sich im Laufe der Zeit ändern würde, würde ich zu dem Schluss kommen, dass API-Versionen sollten nicht lange in Ressourcen-URIs gespeichert werden was bedeutet, dass Ressourcen-URIs, auf die sich API-Nutzer verlassen können, sollten Permalinks sein .
Ja, sicher, es ist möglich, die API-Version in den Basis-URI einzubetten sondern nur für sinnvolle und eingeschränkte Zwecke wie das Debuggen eines API-Clients die mit der neuen API-Version funktioniert. Solche versionierten APIs sollten zeitlich begrenzt und nur für begrenzte Gruppen von API-Benutzern (z. B. während geschlossener Betas) verfügbar sein. Andernfalls verpflichten Sie sich, wo Sie es nicht sollten.
Einige Gedanken zur Wartung von API-Versionen, die ein Verfallsdatum haben. Alle Programmierplattformen/Sprachen, die üblicherweise zur Implementierung von Webdiensten verwendet werden (Java, .NET, PHP, Perl, Rails usw.), ermöglichen die einfache Bindung von Webdienst-Endpunkten an einen Basis-URI. Auf diese Weise ist es einfach sammeln und aufbewahren eine Sammlung von Dateien/Klassen/Methoden getrennt für verschiedene API-Versionen .
Aus der Sicht der API-Benutzer ist es auch einfacher, mit einer bestimmten API-Version zu arbeiten und sich an sie zu binden, wenn sie so offensichtlich ist, aber nur für eine begrenzte Zeit, d. h. während der Entwicklung.
Aus der Sicht des API-Wartungsbeauftragten ist es einfacher, verschiedene API-Versionen parallel zu warten, indem er Versionskontrollsysteme verwendet, die hauptsächlich mit Dateien als kleinster Einheit der (Quellcode-)Versionierung arbeiten.
Bei API-Versionen, die in der URI klar ersichtlich sind, gibt es jedoch einen Vorbehalt: Man könnte diesen Ansatz auch ablehnen, da API-Verlauf wird im URI-Design sichtbar/übergeordnet und ist daher anfällig für Veränderungen im Laufe der Zeit was gegen die Richtlinien von REST verstößt. Ich stimme zu!
Der Weg, diesen vernünftigen Einwand zu umgehen, ist die Implementierung der neuesten API-Version unter dem versionslosen API-Basis-URI. In diesem Fall können API-Client-Entwickler wählen, ob sie:
-
gegen die neueste Version entwickeln (und sich verpflichten, die Anwendung zu pflegen, um sie vor eventuellen API-Änderungen zu schützen, die ihre schlecht gestalteter API-Client ).
-
sich an eine bestimmte Version der API zu binden (was offensichtlich wird), aber nur für eine begrenzte Zeit
Wenn z. B. API v3.0 die neueste API-Version ist, sollten die beiden folgenden Aliase sein (d. h. sich bei allen API-Anfragen identisch verhalten):
http://shonzilla/api/customers/1234
http://shonzilla/api**/v3.0**/customers/1234
http://shonzilla/api**/v3**/customers/1234
Darüber hinaus können API-Clients, die weiterhin versuchen, auf die alt API sollte darüber informiert werden, dass die neueste, frühere API-Version verwendet wird, wenn die von ihnen verwendete API-Version veraltet ist oder nicht mehr unterstützt wird . Der Zugriff auf eine der veralteten URIs wie diese:
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
sollte eine der 30x HTTP-Statuscodes, die eine Umleitung anzeigen die in Verbindung verwendet werden mit Location
HTTP-Header, der auf die entsprechende Version der Ressourcen-URI umleitet, die weiterhin diese ist:
http://shonzilla/api/customers/1234
Es gibt mindestens zwei HTTP-Statuscodes für die Umleitung, die für API-Versionierungsszenarien geeignet sind:
-
301 Dauerhaft verschoben die anzeigt, dass die Ressource mit einem angeforderten URI dauerhaft auf einen anderen URI verschoben wird (der ein Ressourceninstanz-Permalink sein sollte, der keine API-Versionsinformationen enthält). Dieser Statuscode kann verwendet werden, um eine veraltete/nicht unterstützte API-Version anzuzeigen und den API-Client zu informieren, dass eine versionierter Ressourcen-URI wurde durch einen Ressourcen-Permalink ersetzt .
-
302 gefunden der angibt, dass sich die angeforderte Ressource vorübergehend an einem anderen Ort befindet, während der angeforderte URI noch unterstützt werden kann. Dieser Statuscode kann nützlich sein, wenn versionslose URIs vorübergehend nicht verfügbar sind und eine Anfrage unter Verwendung der Umleitungsadresse (z. B. mit Verweis auf den URI mit eingebetteter APi-Version) wiederholt werden sollte und wir den Clients mitteilen wollen, dass sie diese weiterhin verwenden sollen (d. h. die Permalinks).
-
andere Szenarien finden Sie unter Umleitung 3xx Kapitel der HTTP 1.1 Spezifikation