Tworzę usługę RESTfull dla drzewiastej struktury zasobów i zastanawiałem się, jaka byłaby najlepsza struktura adresów URL?
Mam trzy wymagania:
- być w stanie uzyskać kolekcję zasobów root
- być w stanie uzyskać indywidualny zasób
- być w stanie uzyskać zbiór zasobów podrzędnych
Moja obecna myśl to:
/rest/documents
/rest/documents/{id}
/rest/documents/{id}/documents
Myślałem też o przejściu pojedynczych / mnogich ścieżek w celu oznaczenia list lub pojedynczych elementów, ale wiem, że będę miał zasób, który jest taki sam w liczbie mnogiej, jak w liczbie pojedynczej, więc postanowiłem tego nie robić.
Czy ktoś ma jakieś przemyślenia na ten temat? lub masz inny / lepszy sposób na uporządkowanie tego?
web-services
Matt Brailsford
źródło
źródło
Odpowiedzi:
Co przychodzi mi do głowy: nie pozwól, aby interfejs API RESTful odzwierciedlał rekurencyjność samego adresu URL. Pomyśl o tym, twój zasób to tylko dokumenty.
Jeśli Twoje dokumenty są przechowywane fizycznie zgodnie ze strukturą rekurencyjną, utwórz mapowanie na unikalny identyfikator i użyj identyfikatora w adresie URL:
Teraz, jeśli masz takie dokumenty:
wniosek sprawdzi ten adres URL
/abc/asd
dokumentuTak więc teraz musisz zapewnić użytkownikom interfejsu API środki do przemierzania swojej struktury przy niewielkim wysiłku. Można to zrobić poprzez zawinięcie ładunku odpowiedzi (dokumentu) w obiekt zawierający dodatkowe informacje o przechodzeniu, takie jak to:
pod warunkiem, że oczekujesz, że użytkownicy nie będą tworzyć zbyt wielu dokumentów na jednym poziomie, możesz dołączyć do odpowiedzi listę dzieci. Jeśli tak nie jest, możesz zaoferować użytkownikowi pobranie takich identyfikatorów dokumentów podrzędnych, umożliwiając np. Stronicowanie wyników za pomocą parametrów zapytania:
Wreszcie, mówiąc o parametrach zapytania, możesz również podać informacje o ścieżce bezpośrednio przez parametry zapytania:
Wszystkie wymienione podejścia oczekują, że zwykły
GET /rest/documents
zwraca tylko dokumenty root.źródło
Może coś takiego:
gdzie {rootEntity} jest punktem początkowym twojej kolekcji, {leafEntity} to dowolny nazwany węzeł liścia w twoim drzewie.
Możesz dodać kilka parametrów dowolnego z powyższych, aby wybrać, powiedzmy, Najnowsze lub Wszystkie lub coś.
źródło