To dobre i trudne pytanie. Temat projektowania URI jest jednocześnie najważniejszą częścią interfejsu API REST, a zatem potencjalnie długoterminowym zobowiązaniem wobec użytkowników tego interfejsu API .
Ponieważ ewolucja aplikacji i, w mniejszym stopniu, jej API jest faktem i że jest nawet podobna do ewolucji pozornie złożonego produktu, takiego jak język programowania, projekt URI powinien mieć mniej naturalnych ograniczeń i powinien zostać zachowany z czasem . Im dłuższa żywotność aplikacji i interfejsu API, tym większe zaangażowanie użytkowników aplikacji i interfejsu API.
Z drugiej strony, innym faktem jest to, że trudno jest przewidzieć wszystkie zasoby i ich aspekty, które zostałyby zużyte przez API. Na szczęście nie jest konieczne projektowanie całego API, które będzie używane do Apokalipsy . Wystarczy poprawnie zdefiniować wszystkie punkty końcowe zasobu i schemat adresowania każdego zasobu i instancji zasobu.
Z czasem może być konieczne dodanie nowych zasobów i nowych atrybutów do każdego konkretnego zasobu, ale metoda stosowana przez użytkowników API w celu uzyskania dostępu do określonych zasobów nie powinna ulec zmianie, gdy schemat adresowania zasobów stanie się publiczny, a zatem ostateczny.
Ta metoda ma zastosowanie do semantyki czasownika HTTP (np. PUT powinna zawsze aktualizować / zamieniać) i kodów statusu HTTP, które są obsługiwane we wcześniejszych wersjach API (powinny one dalej działać, aby klienci API, którzy pracowali bez interwencji człowieka, mogli kontynuować pracę tak).
Ponadto, ponieważ osadzenie wersji API w URI zakłóciłoby koncepcję hipermediów jako silnika stanu aplikacji (podanego w rozprawie doktorskiej Roy T. Fieldingsa) poprzez posiadanie adresu zasobu / URI, który zmieniałby się z czasem, doszedłbym do wniosku, że API wersje nie powinny być przechowywane w identyfikatorach URI zasobów przez długi czas, co oznacza, że identyfikatory URI zasobów, na których użytkownicy API mogą polegać, powinny być linkami stałymi .
Oczywiście możliwe jest osadzenie wersji interfejsu API w podstawowym identyfikatorze URI, ale tylko do uzasadnionych i ograniczonych zastosowań, takich jak debugowanie klienta interfejsu API, który działa z nową wersją interfejsu API. Takie wersje API powinny być ograniczone czasowo i dostępne tylko dla ograniczonych grup użytkowników API (np. Podczas zamkniętych bet). W przeciwnym razie zobowiązujesz się tam, gdzie nie powinieneś.
Kilka uwag na temat utrzymania wersji API, które mają na nich datę ważności. Wszystkie platformy / języki programowania powszechnie używane do wdrażania usług sieciowych (Java, .NET, PHP, Perl, Rails itp.) Pozwalają na łatwe powiązanie punktów końcowych usługi internetowej z podstawowym identyfikatorem URI. W ten sposób łatwo jest zebrać i zachować zbiór plików / klas / metod oddzielnie dla różnych wersji API .
Z POV użytkowników API łatwiej jest pracować i łączyć się z określoną wersją API, gdy jest to oczywiste, ale tylko przez ograniczony czas, tj. Podczas programowania.
Z POV opiekuna API łatwiej jest utrzymywać równolegle różne wersje API, wykorzystując systemy kontroli źródła, które przeważnie działają na plikach jako najmniejsze jednostki wersji (kodu źródłowego).
Jednak przy wersjach interfejsu API wyraźnie widocznych w URI istnieje zastrzeżenie: można również sprzeciwić się temu podejściu, ponieważ historia interfejsu API staje się widoczna / widoczna w projekcie URI, a zatem jest podatna na zmiany w czasie, co jest niezgodne z wytycznymi REST. Zgadzam się!
Sposobem na obejście tego uzasadnionego sprzeciwu jest zaimplementowanie najnowszej wersji interfejsu API w ramach podstawowego URI interfejsu API bez wersji. W takim przypadku programiści klienta API mogą wybrać:
rozwijać się w stosunku do najnowszej (zobowiązując się do utrzymania aplikacji chroniącej ją przed ewentualnymi zmianami API, które mogą uszkodzić źle zaprojektowanego klienta API ).
powiązać z określoną wersją interfejsu API (która staje się widoczna), ale tylko przez ograniczony czas
Na przykład, jeśli API v3.0 jest najnowszą wersją API, następujące dwa powinny być aliasami (tzn. Zachowywać się identycznie dla wszystkich żądań API):
http: // shonzilla / api / klienci / 1234
http: // shonzilla / api /v3.0 / klienci / 1234
http: // shonzilla / api / v3 / klienci / 1234
Ponadto klienci API, którzy nadal próbują wskazać stary interfejs API, powinni zostać poinformowani o korzystaniu z najnowszej poprzedniej wersji interfejsu API, jeśli używana wersja interfejsu API jest przestarzała lub nie jest już obsługiwana . Dostęp do któregoś z przestarzałych identyfikatorów URI, takich jak te:
http: // shonzilla / api / v2.2 / klienci / 1234
http: // shonzilla / api / v2.0 / klienci / 1234
http: // shonzilla / api / v2 / klienci / 1234
http: // shonzilla / api / v1.1 / klienci / 1234
http: // shonzilla / api / v1 / klienci / 1234
powinien zwrócić dowolny z 30x kodów stanu HTTP wskazujących przekierowanie, które są używane w połączeniu z Location
nagłówkiem HTTP, który przekierowuje do odpowiedniej wersji identyfikatora URI zasobu, który pozostaje tym:
http: // shonzilla / api / klienci / 1234
Istnieją co najmniej dwa kody statusu przekierowania HTTP odpowiednie dla scenariuszy wersjonowania API:
301 Przeniesiono na stałe, wskazując, że zasób z żądanym identyfikatorem URI jest trwale przeniesiony do innego identyfikatora URI (powinien to być bezpośredni link do instancji zasobu, który nie zawiera informacji o wersji interfejsu API). Tego kodu stanu można użyć do wskazania przestarzałej / nieobsługiwanej wersji interfejsu API, informując klienta interfejsu API, że wersjonowany identyfikator URI zasobu został zastąpiony przez bezpośredni link zasobu .
302 Znaleziono wskazujące, że żądany zasób tymczasowo znajduje się w innej lokalizacji, podczas gdy żądany identyfikator URI może być nadal obsługiwany. Ten kod stanu może być przydatny, gdy identyfikatory URI bez wersji są tymczasowo niedostępne i żądanie należy powtórzyć przy użyciu adresu przekierowania (np. Wskazując na identyfikator URI z osadzoną wersją APi) i chcemy poinformować klientów, aby nadal go używali (tj. permalinki).
inne scenariusze można znaleźć w rozdziale Przekierowanie 3xx specyfikacji HTTP 1.1