Jestem w trakcie tworzenia interfejsu API REST i obecnie napotykam następujący problem:
Foo
jest pierwszym zasobem. Operacje CRUD można zastosować za pomocą/foo/
identyfikatora URI.Bar
jest drugim zasobem. Operacje CRUD można zastosować za pomocą/bar/
identyfikatora URI.- Każdy
Foo
jest powiązany z zerem lub jednymBar
. Powodem, dla którego nie traktuję tegoBar
jako podrzędnego źródła,Foo
jest to, że ta samaBar
instancja może być współużytkowana przez wiele różnychFoo
. Pomyślałem, że lepiej jest uzyskać do niego dostęp za pośrednictwem niezależnego identyfikatora URI zamiast/foo/[id]/bar
.
Mój problem polega na tym, że w znacznej liczbie przypadków klienci, którzy pytają o Foo
instancję, są również zainteresowani powiązaną Bar
instancją. Obecnie oznacza to, że muszą wykonać dwa zapytania zamiast jednego. Chcę wprowadzić sposób, który pozwala uzyskać oba obiekty za pomocą jednego zapytania, ale nie wiem, jak modelować interfejs API w tym celu. Co do tej pory wymyśliłem:
- Mogłem wprowadzić parametr zapytania podobnego do tego:
/foo/[id]?include_bar=true
. Problem z tym podejściem polega na tym, że reprezentacja zasobów (np. Struktura JSON) odpowiedzi musiałaby wyglądać inaczej (np. Kontener taki jak{ foo: ..., bar: ... }
zamiast tylko serializacjiFoo
), co powoduje, żeFoo
punkt końcowy zasobu jest „heterogeniczny”. Nie sądzę, że to dobra rzecz. Podczas wysyłania zapytań/foo
klienci powinni zawsze uzyskać tę samą reprezentację zasobów (strukturę), niezależnie od parametrów zapytania. - Innym pomysłem jest wprowadzenie nowego punktu końcowego tylko do odczytu, np
/fooandbar/[foo-id]
. W takim przypadku nie ma problemu ze zwróceniem takiej reprezentacji{ foo: ..., bar: ... }
, ponieważ wtedy jest to tylko „oficjalna” reprezentacjafooandbar
zasobu. Jednak nie wiem, czy taki punkt końcowy pomocnika jest naprawdę ODPOCZYNYWNY (dlatego napisałem „może” w tytule pytania. Oczywiście jest to technicznie możliwe, ale nie wiem, czy to dobry pomysł).
Co myślisz? Czy są jakieś inne możliwości?
Bar
może istnieć bez powiązania z Foo
. Jednak, jak napisałem powyżej, możliwe jest, że wiele Foo
s dzieli to samo Bar
. Powinno być możliwe stworzenie Foo
bez Bar
skojarzenia, więc nie sądzę, że Bar
powinienem być traktowany jak rodzic.