2015-01-12 11 views
8

Ich habe eine Anzahl von Versionierungsschemas für REST API ausgewertet (Header, URL, ...). Der bisher zuverlässigste Ansatz scheint die URL-Option zu sein: Sie funktioniert mit Proxies und ist nicht auf obskure Schemas wie dates for versioning angewiesen.Semantische Versionierung von REST apis?

Jetzt, wenn ich mich umschaue, scheint jeder, der den URL-basierten Ansatz verwendet, Versionen wie v1, v2 und so weiter zu verwenden. Niemand verwendet Nebenversionen oder sogar ein Schema wie semantic versioning.

Dies wirft einige Fragen auf:

  • Wann erhöhen Sie die Versionsnummer eines REST-API (für sicher, Sie weiteres Updates zu ihm haben, als in fünf Jahren nur ein einziges Mal)?
  • Wenn Sie nur einen Bugfix haben, erhöhen Sie wahrscheinlich nicht die Versionsnummer, aber wie unterscheiden Sie beide Versionen?
  • Wenn Sie einen sehr feingranularen Ansatz verwenden, erhalten Sie viele Versionen, die Sie parallel hosten müssen. Wie gehst du damit um?

Mit anderen Worten: Wie ein Unternehmen wie GitHub hat, macht zum Beispiel nur v3 heute (2015), wenn sie sich um im Geschäft sind bereits jetzt 7 Jahre? Bedeutet das, dass sie ihre api nur zweimal geändert haben? Das kann ich kaum glauben.

Irgendwelche Hinweise?

+1

Eigentlich ist das die Hauptversionsnummer. Ich denke, Ressourcenversionierung ist viel wichtiger, aber niemand spricht darüber. – inf3rno

+0

Können Sie etwas weiter erklären, was Sie mit * Ressourcenversionierung * meinen? –

+1

Ofc. Wenn sich eine Ressource ändert, muss sie die Versionsnummer ändern. Wenn ein Client aktualisiert wird, muss er die Versionsnummer der lokal gespeicherten Ressourcendarstellung zusammen mit der Anforderung senden, sodass der Dienst weiß, ob er eine neue Version der Ressource hat oder nicht.Die Leute rufen dieses Etag auf, aber wenn Sie eine Ressource oder eine Antwort mit mehreren Ressourcen haben, können Sie nicht mehrere Etag-Header (afaik) senden, daher müssen Sie die Versionsnummern im Hauptteil senden. – inf3rno

Antwort

16

Die Hauptversionsnummer ist alles, was Sie für einen Webdienst benötigen. Da Ihre Kunden sich nur für rückwärtskompatible Änderungen interessieren und diese (wenn Sie die semantische Versionierung korrekt durchführen) erst dann eingeführt werden, wenn eine neue Hauptversion veröffentlicht wird.

Alle anderen Änderungen (einschließlich neuer Funktionen, Bugfixes, Patches usw.) sollten für Ihre Kunden "sicher" sein. Diese neuen Funktionen haben nicht von Ihren Kunden verwendet werden, und Sie möchten wahrscheinlich nicht fortsetzen, dass die ungepatchte Version, die Fehler X oder Y mehr als nötig enthält. Die vollständige Versionsnummer in Ihren URLs (oder welche Methode auch immer Sie für die API-Versionierung verwenden) würde bedeuten, dass Ihre Kunden die URL Ihrer API jedes Mal aktualisieren müssen, wenn Sie ein Update/Bugfix für Ihre API erstellen Verwenden Sie weiterhin eine ungepatchte Version, bis sie dies tun.

Dies bedeutet nicht, dass Sie semantische Versionierung natürlich nicht intern verwenden können! Verwenden Sie einfach den ersten Teil (Hauptversion) als Versionsnummer für Ihre API. Es macht einfach keinen Sinn, die vollständige Versionsnummer in Ihr URL/Header/anderes Versionierungssystem aufzunehmen.

Um Ihre Frage zu beantworten: Sie aktualisieren Ihre API jedes Mal, wenn Sie eine neue Version erstellen, aber Sie geben nur eine neue API-Version frei, wenn Sie eine neue Hauptversion haben. Auf diese Weise müssen Sie nur ein paar verschiedene Versionen hosten (und Sie können natürlich alte Versionen im Laufe der Zeit ablehnen).

+0

Danke für deine tolle und sehr ausführliche Antwort! Nur noch eins: Wenn das System nicht im Web gehostet wird, sondern beim Kunden installiert ist, habe ich am Ende eine Menge leicht unterschiedlicher Varianten einer bestimmten Hauptversion, oder? Wie gehe ich damit um? Mit anderen Worten: Ich kann nicht sicher sein, dass "v1" für einen Kunden das gleiche wie "v1" für einen anderen bedeutet. –

+0

Können Sie das Szenario etwas weiter erklären? Sie entwickeln eine API, die auf vielen Kundenservern ausgeführt wird, aber nur in ihrem lokalen Netzwerk verfügbar ist (und daher nur intern verwendet wird)? Ist das korrekt? –

+0

Korrekt. Aber wir müssen es unterstützen. Das heißt, ein Kunde ruft an und beschwert sich über ein Problem mit der REST API. Wir fragen, welche Version sie verwenden, und sie sagen uns, dass es "v1" ist. Leider ist dies nicht sehr hilfreich, da es viele 'v1's gibt. Natürlich können wir nach der spezifischen Serverversion fragen, aber das ist ein zusätzlicher Schritt (und wir sind unsicher, ob wir es haben wollen). Macht das die Frage klarer? –