Jestem w trakcie tworzenia interfejsu API REST i obecnie napotykam następujący problem:
Foojest pierwszym zasobem. Operacje CRUD można zastosować za pomocą/foo/identyfikatora URI.Barjest drugim zasobem. Operacje CRUD można zastosować za pomocą/bar/identyfikatora URI.- Każdy
Foojest powiązany z zerem lub jednymBar. Powodem, dla którego nie traktuję tegoBarjako podrzędnego źródła,Foojest to, że ta samaBarinstancja 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 Fooinstancję, są również zainteresowani powiązaną Barinstancją. 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, żeFoopunkt końcowy zasobu jest „heterogeniczny”. Nie sądzę, że to dobra rzecz. Podczas wysyłania zapytań/fooklienci 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” reprezentacjafooandbarzasobu. 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?
Barmoże istnieć bez powiązania z Foo. Jednak, jak napisałem powyżej, możliwe jest, że wiele Foos dzieli to samo Bar. Powinno być możliwe stworzenie Foobez Barskojarzenia, więc nie sądzę, że Barpowinienem być traktowany jak rodzic.