Dies ist eine gute und knifflige Frage. Das Thema URI-Design ist gleichzeitig der wichtigste Teil einer REST-API und daher ein potenziell langfristiges Engagement gegenüber den Benutzern dieser API .
Da die Entwicklung einer Anwendung und in geringerem Maße ihrer API eine Tatsache des Lebens ist und sogar der Entwicklung eines scheinbar komplexen Produkts wie einer Programmiersprache ähnelt, sollte das URI-Design weniger natürliche Einschränkungen aufweisen und beibehalten werden im Laufe der Zeit . Je länger die Lebensdauer der Anwendung und der API ist, desto größer ist das Engagement für die Benutzer der Anwendung und der API.
Andererseits ist eine andere Tatsache im Leben, dass es schwierig ist, alle Ressourcen und ihre Aspekte vorherzusehen, die durch die API verbraucht würden. Glücklicherweise ist es nicht erforderlich, die gesamte API zu entwerfen, die bis zur Apokalypse verwendet wird . 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 bestimmten Ressource hinzufügen. Die Methode, mit der API-Benutzer auf eine bestimmte Ressource zugreifen, sollte sich jedoch nicht ändern, sobald ein Ressourcenadressierungsschema öffentlich und damit endgültig wird.
Diese Methode gilt für die HTTP-Verbsemantik (z. B. sollte PUT immer aktualisiert / ersetzt werden) und für HTTP-Statuscodes, die in früheren API-Versionen unterstützt werden (sie sollten weiterhin funktionieren, damit API-Clients, die ohne menschliches Eingreifen gearbeitet haben, weiterhin funktionieren können so wie das).
Da die Einbettung der API-Version in die URI das Konzept von Hypermedia als Motor des Anwendungsstatus (in der Dissertation von Roy T. Fieldings angegeben) durch eine Ressourcenadresse / URI stören würde, die sich im Laufe der Zeit ändern würde, würde ich diese API schließen Versionen sollten nicht lange in Ressourcen-URIs aufbewahrt werden. Dies bedeutet, dass Ressourcen-URIs, auf die sich API-Benutzer verlassen können, Permalinks sein sollten .
Sicher, es ist möglich, die API-Version in den Basis-URI einzubetten, aber nur für vernünftige und eingeschränkte Zwecke wie das Debuggen eines API-Clients , der mit der neuen API-Version funktioniert. Solche versionierten APIs sollten zeitlich begrenzt sein und nur begrenzten Gruppen von API-Benutzern (wie bei geschlossenen Betas) zur Verfügung stehen. Ansonsten verpflichten Sie sich, wo Sie nicht sollten.
Einige Gedanken zur Wartung von API-Versionen mit Ablaufdatum. Alle Programmierplattformen / -sprachen, die üblicherweise zur Implementierung von Webdiensten verwendet werden (Java, .NET, PHP, Perl, Rails usw.), ermöglichen die einfache Bindung von Webdienstendpunkten an einen Basis-URI. Auf diese Weise ist es einfach , eine Sammlung von Dateien / Klassen / Methoden zu sammeln und getrennt von verschiedenen API-Versionen zu halten .
Mit dem POV der API-Benutzer ist es auch einfacher, mit einer bestimmten API-Version zu arbeiten und diese zu binden, wenn dies offensichtlich ist, jedoch nur für eine begrenzte Zeit, dh während der Entwicklung.
Mit dem POV des API-Betreuers ist es einfacher, verschiedene API-Versionen parallel zu verwalten, indem Quellcodeverwaltungssysteme verwendet werden, die vorwiegend mit Dateien als kleinste Einheit der (Quellcode-) Versionierung arbeiten.
Bei API-Versionen, die in URI deutlich sichtbar sind, gibt es jedoch eine Einschränkung: Man könnte diesen Ansatz auch ablehnen, da der API-Verlauf im URI-Design sichtbar / aparent wird und daher im Laufe der Zeit Änderungen unterliegt, die gegen die Richtlinien von REST verstoßen. Genau!
Um diesen vernünftigen Einwand zu umgehen, müssen Sie die neueste API-Version unter dem versionlosen API-Basis-URI implementieren. In diesem Fall können API-Client-Entwickler Folgendes auswählen:
Entwickeln Sie gegen die neueste Version (verpflichten Sie sich, die Anwendung so zu warten, dass sie vor eventuellen API-Änderungen geschützt ist, die den schlecht gestalteten API-Client beschädigen könnten ).
an eine bestimmte Version der API binden (was offensichtlich wird), jedoch nur für eine begrenzte Zeit
Wenn API v3.0 beispielsweise die neueste API-Version ist, sollten die folgenden beiden Aliase sein (dh sich für alle API-Anforderungen identisch verhalten):
http: // shonzilla / api / customers / 1234
http: // shonzilla / api /v3.0 / customers / 1234
http: // shonzilla / api / v3 / customers / 1234
Darüber hinaus sollten API-Clients, die weiterhin versuchen, auf die alte API zu verweisen, über die Verwendung der neuesten vorherigen API-Version informiert werden, wenn die von ihnen verwendete API-Version veraltet ist oder nicht mehr unterstützt wird . 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 einen der 30x HTTP-Statuscodes zurückgeben, die die Umleitung angeben , die in Verbindung mit dem Location
HTTP-Header verwendet wird, der zur entsprechenden Version des Ressourcen-URI umleitet, die noch diese sein muss:
http: // shonzilla / api / customers / 1234
Es gibt mindestens zwei HTTP-Statuscodes für die Umleitung, die für API-Versionsszenarien geeignet sind:
301 Wird permanent verschoben, um anzuzeigen , dass die Ressource mit einem angeforderten URI dauerhaft in einen anderen URI verschoben wird (dies sollte ein Permalink für eine Ressourceninstanz sein, der keine API-Versionsinformationen enthält). Dieser Statuscode kann verwendet werden, um eine veraltete / nicht unterstützte API-Version anzuzeigen und den API-Client darüber zu informieren, dass ein versionierter Ressourcen-URI durch einen Ressourcen-Permalink ersetzt wurde .
302 Gefunden , um anzuzeigen , dass sich die angeforderte Ressource vorübergehend an einem anderen Speicherort befindet, während der angeforderte URI möglicherweise noch unterstützt wird. Dieser Statuscode kann nützlich sein, wenn die URIs ohne Version vorübergehend nicht verfügbar sind und eine Anforderung unter Verwendung der Umleitungsadresse wiederholt werden sollte (z. B. Verweisen auf den URI mit eingebetteter APi-Version), und wir möchten Clients anweisen, ihn weiterhin zu verwenden (dh die Permalinks).
Weitere Szenarien finden Sie im Kapitel Redirection 3xx der HTTP 1.1-Spezifikation