Czytałem o strategiach wersjonowania dla interfejsów API ReST i coś, czego żaden z nich nie wydaje się uwzględniać, dotyczy sposobu zarządzania podstawową bazą kodu.
Załóżmy, że wprowadzamy kilka istotnych zmian w interfejsie API - na przykład zmieniamy nasz zasób klienta, aby zwracał oddzielne pola forename
i surname
pola zamiast jednego name
pola. (W tym przykładzie użyję rozwiązania do wersjonowania adresów URL, ponieważ łatwo jest zrozumieć związane z tym pojęcia, ale pytanie dotyczy również negocjacji treści lub niestandardowych nagłówków HTTP)
Mamy teraz punkt końcowy w http://api.mycompany.com/v1/customers/{id}
i inny niezgodny punkt końcowy w http://api.mycompany.com/v2/customers/{id}
. Wciąż publikujemy poprawki błędów i aktualizacje zabezpieczeń API v1, ale rozwój nowych funkcji skupia się teraz na wersji v2. Jak piszemy, testujemy i wdrażamy zmiany na naszym serwerze API? Widzę co najmniej dwa rozwiązania:
Użyj gałęzi / tagu kontroli źródła dla bazy kodu v1. v1 i v2 są opracowywane i wdrażane niezależnie, z połączeniami kontroli wersji używanymi w razie potrzeby do zastosowania tej samej poprawki błędu do obu wersji - podobnie jak w przypadku zarządzania bazami kodów dla aplikacji natywnych podczas opracowywania nowej głównej wersji, przy jednoczesnym wsparciu poprzedniej wersji.
Spraw, aby baza kodu była świadoma wersji interfejsu API, dzięki czemu otrzymujesz jedną bazę kodu, która obejmuje zarówno reprezentację klienta w wersji 1, jak i reprezentację klienta w wersji 2. Traktuj przechowywanie wersji jako część architektury swojego rozwiązania, a nie jako problem z wdrożeniem - prawdopodobnie używając kombinacji przestrzeni nazw i routingu, aby upewnić się, że żądania są obsługiwane przez właściwą wersję.
Oczywistą zaletą modelu gałęzi jest to, że usunięcie starych wersji API jest trywialne - po prostu przestań wdrażać odpowiednią gałąź / tag - ale jeśli używasz kilku wersji, możesz skończyć z naprawdę zawiłą strukturą gałęzi i potokiem wdrażania. Model „ujednoliconej bazy kodu” pozwala uniknąć tego problemu, ale (jak sądzę?) Znacznie utrudniłby usunięcie przestarzałych zasobów i punktów końcowych z bazy kodu, gdy nie są już potrzebne. Wiem, że jest to prawdopodobnie subiektywne, ponieważ jest mało prawdopodobne, aby była prosta, poprawna odpowiedź, ale jestem ciekawy, jak organizacje, które utrzymują złożone interfejsy API w wielu wersjach, rozwiązują ten problem.