Wersjonowanie REST api (tylko wersja reprezentacji, nie sam zasób)

Przyjrzałem się najlepszym praktykom wersjonowania API?, ale nie jestem do końca przekonany do odpowiedzi, więc ponownie kwestionuję część wersjonowania z bardziej konkretnym przykładem. Mam dwa Uri (jeden z wersjonowaniem jako część URI i jeden bez): {]}

http://xxxx/v1/user/123    -> favored solution in discussed thread
http://xxxx/user/123             
Mam wątpliwości, czy pierwszy link wyraża ideę odpoczynku. Uważam, że http://xxxx/v1/user/123 jest mylące, ponieważ sugeruje to, że kiedyś pojawi się wyższa wersja api, taka jak http://xxxx/v2/user/123. Ale to nie ma sensu w kategoriach odpoczynku, sama wersja api to HTTP 1.0 lub 1.1, który jest już wysyłany wewnątrz żądania HTTP. Ten widok REST resource centric różni się bardzo od innych interfejsów api, takich jak SOAP lub Java (gdzie powszechne jest posiadanie wersji api w kwalifikowanych nazwach).

W spoczynku jedyną rzeczą, w której wersjonowanie ma sens, jest reprezentacja tego zasobu(np. nowe pola są dodawane lub usuwane). Ta wersjonowanie należy do części content-negotiation typu:

http://xxx/user/123 + HTTP 'Accept' Header -> Content negotation through header
http://xxx/user/123?v=1                    -> for perma-links/hyperlinks

Można też argumentować że taka negocjacja zawartości wersji może być częścią URI wewnątrz ścieżki, ale uważam, że jest to sprzeczne z intuicją, ponieważ możesz skończyć z różnymi URI dla tego samego zasobu i w pewnym momencie będziesz musiał utrzymywać przekierowania.

Podsumowując: w REST URI nie ma wersjonowania api, tylko wersjonowanie reprezentacji zasobu. Wersja reprezentacji-info należy do Content-negotiation(jako queryParam lub HTTP 'Accept').

Co o tym myślisz? W jakich rzeczach byś nie zgadzam się/Zgadzam?
Author: Community, 2010-01-08

7 answers

Całkowicie się Zgadzam; URI wyraża tożsamość, tożsamość nie zmienia się po wprowadzeniu nowej wersji. Oczywiście mogą być nowe URI dla dodatkowych pojęć, a istniejące Uri mogą przekierować ... ale w tym " v2 " w URI pachnie RPCish dla mnie.

Zauważ, że to nie ma nic wspólnego z odpoczynkiem, tak naprawdę, ponieważ z perspektywy odpoczynku to tylko postacie.

 36
Author: Stefan Tilkov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-08 15:27:15

Można Można słuchać dla X-API-Version nagłówek żądania HTTP. Jeśli nagłówek istnieje, to serwer musi używać tej wersji API. Jeśli nagłówek nie istnieje, serwer może korzystać z najnowszej wersji API.

> GET /user/123 HTTP/1.1
> Host: xxx
> X-API-Version: >=1.5.1, <2.0.0
> Accept: application/json
>

< HTTP/1.1 200 OK
< X-API-Version: 1.6.12
<
< { "user": { "id": 123, "name": "Bob Smith" } }
<
 10
Author: yfeldblum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-08 15:42:36

Jeśli to coś znaczy, zgadzam się z Tobą Manuel. Możesz zobaczyć moje rozumowanie w tym pytaniu Jak wersja REST URIs

Jest wiele osób, które wydają się nie zgadzać, ale nie martwiłbym się. To, jak wygląda twój adres url, naprawdę nie ma dużego wpływu na twojego klienta, o ile szanujesz ograniczenie hipertekstowe.

 9
Author: Darrel Miller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:36

Zgadzam się, że nie chcesz widzieć wersji w Uri zasobów prezentowanych w Twoim API. To sprawia, że nie są "fajne". Zgadzam się również, że to jest reprezentacje, które są najbardziej prawdopodobne, aby zmienić.

Rodzi to jednak pytanie, co się stanie, gdy zmienisz zawartość danej reprezentacji. Na przykład, jeśli oryginalna reprezentacja JSON frobnitza to

{"x": "bam", "y": "hello"}

I chcesz dodać pole " z " możesz czuć, że klient powinien mieć jakieś świadomość, że jesteśmy teraz na wersji 2 jakiegoś schematu danych.

Nie jestem tego pewien. Myślę, że masz kilka opcji:
  • uelastycznij swoich klientów w twarz delikatnie zmieniającym się przedstawieniem. W powyższym przykładzie nadal generujemy słownik JSON.
  • jeśli musisz, umieść wersję w samej reprezentacji(pole version w tym przykładzie). W ten sposób skutecznie deklarujesz subreprezentację w typie zawartości JSON. Tak myślę. to dość ograniczające.
  • Użyj własnych typów MIME i ich wersji: application/x-my-special-json1.0, application/x-my-special-json1.1. Pozwala to na wersję swoich reprezentacji niezależnie od siebie. Ponownie, z tym jednym robisz znaczne zapotrzebowanie na swoich klientów, aby wiedzieć, co się dzieje.

Ogólnie myślę, że chcesz zoptymalizować swoje API i swoje reprezentacje dla klientów, których sam nie wymyśliłeś; tych, które inni ludzie będą twórz po odkryciu swoich zasobów. Uważam, że jest to przydatne nawet w przypadku, gdy tworzysz coś, co jest prywatne, ponieważ buduje się w użytecznym ograniczeniu projektowym, które pomoże uczynić Twój system bardziej solidnym.

 2
Author: cdent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-12 11:29:16

Znajduję http://xxxx/v1/user/123 mylące, gdyż sugeruje, że tam kiedyś będzie wyższa wersja api jak http://xxxx/v2/user/123

To nie sugeruje , że-jednak masz tę zdolność w przyszłości.

Ale to nie ma sensu w spoczynku warunki, sama wersja api to HTTP 1.0 lub 1.1, który jest już wysyłany wewnątrz żądania HTTP.

Wersja twojego API i wersja HTTP, którą jesteś używanie do składania wniosków nie musi być równe.

Można też argumentować, że taka wersja treść-negocjacje mogą być częścią URI wewnątrz ścieżki, ale znajduję intuicyjne, bo można koniec z różnymi URI dla tych samych zasobów i muszą utrzymywać przekierowuje w pewnym momencie.

Dobrze jest mieć wersję jako parametr URI, jak pokazałeś.

Http://xxx/user/123?v=1 - > for perma-links / hyperlinks

 1
Author: mr-sk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-08 01:33:55

Innym podejściem może być stwierdzenie, że "jedna reprezentacja ma wiele API":

http://xxx/user/123/api/1.json

I jeśli chcesz, możesz zwrócić reprezentację za pomocą najnowszego API, gdy żądasz w ten sposób:

http://xxx/user/123.json

Osobiście bardziej lubię inne rozwiązania, ale jest to kolejne podejście, którego jeszcze nie widziałem.

 1
Author: MPV,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-11 12:52:21

Dla reszty, to, o czym większość odpowiedzi zapomina, to element danych. Zakładam, że wiele wersji API nadal współdzielą tę samą warstwę danych. Oznacza to, że warstwa danych zmusza do myślenia w sposób zgodny wstecz. Duże zmiany, które należy wprowadzić, są możliwe tylko wtedy, gdy API zmieni się w sposób zgodny wstecz. W praktyce oznacza to, że dodatkowe właściwości są dodawane po cichu do twoich jednostek podczas używania deprecation by date w dokumencie API, aby wskazać, kiedy coś zostanie usunięte. Najlepiej użyć schematu rejestracji z adresem e-mail użytkowników klucza API, dzięki czemu można powiadomić ich o dezaktualizacji w określonym zakresie (a la Facebook).W związku z tym nie sądzę, aby trzeba określić wersję gdziekolwiek.

 0
Author: Pepster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-16 17:53:47