Zakładam, że mam dwa zasoby najwyższego poziomu: Foo
i Bar
. Teraz Foo
muszą być połączone z niektórymi z Bar
. W klasie Java może to wyglądać mniej więcej tak:Projektowanie interfejsu REST API: łączenie zasobów
public class Foo {
Set<Bar> bars;
}
public class Bar { … }
Chciałbym kształtować reprezentację XML Foo
aby coś takiego:
GET /foos/1
<foo>
…
<atom:link rel="self" href="/foos/1" />
<atom:link rel="bars" href="/foos/1/bars" />
</foo>
Więc dość dużo wystawiać wszystkie Bar
przypisany do Foo
jako zasób zagnieżdżony. Oznacza to, że zasoby mają indywidualny cykl życia (agregacja zamiast kompozycji). Zasób zagnieżdżony może wtedy wystawiać wszystkich połączonych Bar
coś takiego:
GET /foos/1/bars
<bars>
<atom:link rel="bar" href="/foos/1/bars/1" />
<atom:link rel="bar" href="/foos/1/bars/2" />
</bars>
Alteratively mogłem Inline kolekcję w <foo>
elementem góry. Jednak wciąż mam kilka pytań: podczas gdy to pozwala mi ładnie usunąć Bar
z Foo
przez wywołanie żądania do np. DELETE
/foos/1/bars/1
, ale w jaki sposób przypisałbym wtedy Bar
do Foo
? Zakładając, że klient będzie uzyskanie dostępu /bars
:
GET /bars
<bars>
<bar>
…
<atom:link rel="self" href="/bars/4711" />
</bar>
</bars>
i decydując chce przypisać /bars/1
do /foo/1/bars
. Myślałem o zgłoszeniu POST
do /foo/1/bars
, ale nie byłem pewien, co przesłać. Element link
wskazuje na zasób Bar
, taki jak poniższy?
POST /foos/1/bars
<atom:link href="/bars/4711" />
Wydaje się to całkiem w porządku, ponieważ klienci wciąż nie będą musieli tworzyć adresów URL i nadal będziemy spełniać ograniczenia REST. Jednak wydaje się nieco dziwne, jeśli chodzi o linki do serwera. Czy istnieje lepsze rozwiązanie tego scenariusza?
Bez wahania przyjmuję POSTing link do ustalenia związku między dwoma zasobami. Niektórzy uważają, że powinieneś pobrać zasób, a następnie POST, aby był on samopisujący, ale nie jestem przekonany, że jest to konieczne. –
To też uważam za powód, dla którego tworzysz niepotrzebną rozmowę, i b) nie potrzebujesz rzeczywistej potrzeby, aby rzeczywiście utworzyć link. –