Jest tu kilka dobrych odpowiedzi, ale nie jestem pewien, czy pomogą ci przekonać współpracowników. Jak wielu zauważyło, to, co sugerujesz, nie jest odejściem od RESTful design i myślę, że jest to kluczem do włączenia ich w twoją propozycję.
REST nie polega na upewnieniu się, że interfejs API pozwala tylko na przechowywanie i pobieranie danych. Raczej dotyczy działań modelowania jako zasobów. Twój interfejs API powinien umożliwiać podejmowanie działań (w końcu jest to interfejs programowania aplikacji ). Pytanie brzmi, jak modelować te działania.
Zamiast wymyślić termin, przykłady są prawdopodobnie najlepszym sposobem na wyjaśnienie tego swoim współpracownikom . W ten sposób możesz pokazać, jak oni to robią teraz, jakie problemy to powoduje, rozwiązanie, które rozwiązuje problem i jak nadal pozostaje ODPOWIEDZIALNY.
Spójrzmy na obiekt klienta.
Problem:
Interfejsy użytkownika POST klienta, ale kolejne tabele nie zostały jeszcze zaktualizowane. Co się stanie, jeśli jedno z kolejnych wywołań nie powiedzie się z powodu błędu w kodzie interfejsu użytkownika (lub nieprawidłowo działającej wtyczki przeglądarki itp.)? Teraz Twoje dane są niespójne. Może to być nawet stan, który psuje inne części interfejsu API lub interfejsu użytkownika, nie wspominając już o tym, że jest po prostu nieprawidłowy. Jak się odzyskujesz? Będziesz musiał przetestować każdy możliwy stan, aby upewnić się, że to niczego nie zepsuje, ale trudno byłoby wiedzieć, co jest możliwe.
Rozwiązanie:
Utwórz punkt końcowy interfejsu API, aby utworzyć klientów. Wiesz, że nie chcesz mieć punktu końcowego „/ customer / create”, a nawet „/ create-customer”, ponieważ create jest czasownikiem i naruszy REST. Więc dopracuj to. „/ tworzenie-klientów” może działać. Teraz, kiedy opublikujesz swój obiekt CustomerCreation, wyśle on wszystkie potrzebne pola, aby klient mógł zostać w pełni utworzony. Punkt końcowy zapewni, że dane są kompletne i poprawne (zwracając wartość 400 lub coś, jeśli nie powiedzie się sprawdzanie poprawności) i może na przykład zachować wszystko w ramach jednej transakcji db.
Jeśli potrzebujesz również punktu końcowego do GET / obiektów klientów, to w porządku. Możesz mieć oba. Sztuką jest tworzenie punktów końcowych, które spełniają potrzeby konsumentów.
Zalety:
- Gwarantujesz, że nie skończy się zły stan
- U deweloperów interfejsu użytkownika jest to łatwiejsze, jeśli nie muszą oni „znać” porządkowania żądań, problemów związanych z weryfikacją itp
- Interfejs API nie jest tak gadatliwy, co zmniejsza opóźnienie żądań sieciowych
- Łatwiej jest testować i konceptualizować scenariusze (brakujące / zniekształcone fragmenty danych z interfejsu użytkownika nie są rozłożone na żądania, z których niektóre mogą się nie powieść)
- Umożliwia lepszą enkapsulację logiki biznesowej
- Zasadniczo ułatwia bezpieczeństwo (ponieważ użytkownicy mogą modyfikować logikę biznesową i aranżacyjną w interfejsie użytkownika)
- Prawdopodobnie ograniczy duplikację logiki (bardziej prawdopodobne, że będziesz mieć ponad 2 konsumentów interfejsu API niż 2+ interfejsy API, które dają dostęp do tych samych danych)
- Nadal 100% RESTful
Niedogodności:
- Jest to potencjalnie więcej pracy dla programistów zaplecza (ale może nie być na dłuższą metę)
Ludziom może być trudno zrozumieć ten paradygmat i co w nim dobrego, jeśli go nie wypróbowali. Mamy nadzieję, że możesz pomóc im zobaczyć, korzystając z przykładu z własnego kodu.
Moje własne doświadczenie jest takie, że gdy deweloperzy w moim zespole zaczęli wdrażać tę strategię, prawie natychmiast dostrzegli korzyści.
Dalsze badanie:
Ten artykuł z thinktworks naprawdę pomógł mi zrozumieć modelowanie działań jako obiektów na praktycznych przykładach: https://www.thoughtworks.com/insights/blog/rest-api-design-resource-modeling
Sugerowałbym również przeczytanie o CQRS i zaopatrzeniu w zdarzenia, ponieważ dotyczą one właśnie tego rodzaju rzeczy (tj. Oddzielenie interfejsu API od rzeczywistej logiki trwałości). Nie wiem, jak chętni byliby twoi współpracownicy, aby czytać tego rodzaju rzeczy, ale może to dać ci większą jasność i pomóc ci to wyjaśnić.