2010-07-14 6 views
11

Es wird gesagt, dass in einem gut definierten RESTful-System die Clients nur den Root-URI oder wenige bekannte URIs kennen müssen und der Client alle anderen Links durch diese initialen URIs entdecken soll. Ich verstehen, die Vorteile (entkoppelte Kunden) von diesem Ansatz aber der Nachteil für mich ist, dass der Kunde jedes Mal die Links zu entdecken, braucht es den Zugang etwas dh die folgende Hierarchie von Ressourcen gegeben versucht:Connectedness & HATEOAS

/collection1 
collection1 
    |-sub1 
    |-sub1sub1 
|-sub1sub1sub1 
     |-sub1sub1sub1sub1 
    |-sub1sub2 
    |-sub2 
    |-sub2sub1 
    |-sub2sub2 
    |-sub3 
    |-sub3sub1 
    |-sub3sub2 

Wenn wir folgen Der "Client muss nur den Root-URI" Ansatz kennen, dann sollte ein Client nur die root URI ie/collection1 oben kennen und der Rest von URIs sollte von den Clients durch Hypermedia-Links entdeckt werden. Ich finde das umständlich, weil jedes Mal, wenn ein Client ein GET ausführen muss, sagen wir auf sub1sub1sub1sub1, sollte der Client zuerst ein GET auf/collection1 und den folgenden Link in der zurückgegebenen Repräsentation ausführen und dann mehrere GETs auf Unterressourcen ausführen, um das zu erreichen gewünschte Ressource? Oder ist mein Verständnis von Verbundenheit völlig falsch?

Mit freundlichen Grüßen, Suresh

+0

Nur der REST-Dienst ist zustandslos, der Client ist es nicht. So kann sich der Client die vorherigen Ressourcen, seine URLs usw. merken, zum Beispiel durch ein verschachteltes Navigationsmenü ... – inf3rno

Antwort

6

Sie werden auf diese Abweichung stoßen, wenn Sie versuchen, eine REST-API zu erstellen, die nicht mit dem Fluss des Benutzeragenten übereinstimmt, der die API verwendet.

Wenn Sie eine Clientanwendung ausführen, wird dem Benutzer immer ein Startbildschirm angezeigt. Wenn Sie den Inhalt und die Optionen auf diesem Bildschirm mit der Stammdarstellung abgleichen, werden die verfügbaren Links und gewünschten Übergänge gut zusammenpassen. Wenn der Benutzer Optionen auf dem Bildschirm auswählt, können Sie zu anderen Darstellungen wechseln und die Benutzeroberfläche des Clients sollte aktualisiert werden, um die neue Darstellung widerzuspiegeln.

Wenn Sie versuchen, Ihre REST-API als eine Art verknüpftes Datenrepository und Ihre Client-UI als unabhängige Gruppe von Übergängen zu modellieren, werden Sie HATEOAS ziemlich schmerzhaft finden.

+0

schmerzhaft ist nicht unbedingt wahr: Ich habe gerade dies, eine Hierarchie von Sammlungen von Elementen, und der Client, wenn es beginnt, drillt es ein oder zwei Ebenen und Drilldowns auf einen bestimmten Pfad (der Pfad, den der Client verwendet haben wenn es heruntergefahren ist). Der Cache des Clients ist persistent, so dass alle Anforderungen bedingt sind und sehr selten neue Repräsentationen über den Draht gehen, und die Aktualisierung kann asynchron im Hintergrund ausgeführt werden, indem vollständig vom Cache gearbeitet wird. – mogsie

+0

und ich stimme zu, dass die Modellierung der "API" als die Anforderungen der Client-Anwendung für eine effektive Sitzung, aber ich denke, der Punkt ist, dass eine API oft auf viele Clients, nicht nur diesen einen Client gerecht werden sollte. – mogsie

+0

@mogsie Es kann in vielen Fällen möglich sein, eine API für mehrere Clients zu erstellen, aber in den meisten Fällen ist es weitaus effizienter, eine API für einen bestimmten Fall zu erstellen. Zufällige Wiederverwendung ist das, was REST bereitstellen soll, nicht unbedingt geplante Wiederverwendung. –

0

Ich glaube nicht, dass das ist die strenge Anforderung. Nach meinem Verständnis ist es für einen Kunden legal, direkt auf Ressourcen zuzugreifen und von dort aus zu starten. Wichtig ist, dass Sie dies nicht für Zustandsübergänge tun, d. H. Nicht automatisch mit/foo2 fortfahren, nachdem Sie auf/foo1 und so weiter gearbeitet haben. Abrufen/Produkte/1234 zunächst zu bearbeiten scheint völlig in Ordnung. Der Server könnte immer, sagen wir, eine Weiterleitung an/shop/products/1234, um rückwärtskompatibel zu bleiben (was auch für Suchmaschinen, Lesezeichen und externe Links wünschenswert ist).

4

Ja, es ist richtig, dass die Client-Anwendung die Links durchläuft, aber sobald sie eine Ressource entdeckt hat, ist nichts falsch daran, einen Verweis auf diese Ressource zu behalten und sie länger als eine Anfrage zu verwenden. Wenn Ihr Kunde die Möglichkeit hat, sich dauerhaft Dinge zu merken, kann er dies tun.

betrachten, wie ein Webbrowser seine Lesezeichen behält. Sie haben vielleicht zehn oder hundert Lesezeichen im Browser, und Sie haben wahrscheinlich einige davon tief in einer Hierarchie von Seiten gefunden, aber der Browser erinnert sich pflichtbewusst an sie, ohne sich den Pfad merken zu müssen, den er brauchte, um sie zu finden.

Eine komplexere Clientanwendung könnte sich den URI von sub1sub1sub1sub1 merken und ihn wiederverwenden, wenn er noch funktioniert. Es ist wahrscheinlich, dass es immer noch das Gleiche darstellt (es sollte). Wenn es nicht länger existiert oder aus irgendeinem anderen Grund fehlschlägt (4xx), können Sie Ihre Schritte nachvollziehen, um zu sehen, ob Sie einen geeigneten Ersatz finden können.

Und natürlich, was Darrel Miller sagte :-)

+1

Ich mag Ihre Analogie hier. Es gibt diese Idee, wo alles miteinander verbunden ist und was nicht verbunden ist, kann nicht erreicht werden. Google ist in diesem Sinne die Wurzel aller Navigationen, aber die Leute speichern ständig Shortcuts (Lesezeichen). Aber wenn Sie nicht in Google sind, dann existieren Sie im Grunde nicht. – Alex

+0

Danke. Oder, um genau zu sein: Wenn es keinen Weg von Google zu einer Seite gibt, existiert sie nicht. Ein bisschen wie das Rätsel: "Wenn ein Baum in einen Wald fällt und niemand da ist, um ihn zu hören, macht er Lärm?" – mogsie

Verwandte Themen