Gibt es Strategien, um REST-Services mit HATEOAS zu entdecken?

10

Wenn Sie einen REST-Service mit der Einschränkung HATEOAS erstellen , ist es sehr einfach, das Vorhandensein von Ressourcen durch Verknüpfen anzukündigen . Sie erstellen einen GETEintrag im Stammverzeichnis meiner Website und ich antworte mit dem Stammdokument, in dem alle Ressourcen der ersten Ebene aufgeführt sind:

{
    users: { href: "/users" }
    questions { href: "/questions" }
}

Clients, die verstehen, wie diese hrefWerte gelesen werden, können GETAnforderungen an diese ausführen und alle aktuellen in der Anwendung verfügbaren Ressourcen ermitteln.

Dies funktioniert gut für grundlegende Suchszenarien, gibt jedoch nicht an, ob eine Ressource abfragbar ist. Zum Beispiel kann es sinnvoll sein, Folgendes auszuführen:

GET /users?surname=Smith

Gibt es Formate, die diese Abfragefähigkeit mit genügend Informationen ausdrücken können, damit ein Client eine kohärente Abfrage erstellen kann, ohne dass er zuvor über die Ressource informiert ist?

Darüber hinaus gibt es eine Möglichkeit auszudrücken, dass ein Client einen POSTan einem bestimmten Ort mit einem erwarteten Ort ausführen darf . Beispielsweise kann erwartet werden, dass ein Client Folgendes ausführt, um eine neue Fragenressource zu erstellen:

POST /questions

{
    title: "Are there strategies for discovering REST services using HATEOAS?",
    body: "When building a REST service with the HATEOAS constraint, it's very..."
}

Wenn wir HTML als Format für den menschlichen Gebrauch verwenden, können wir viel davon durch die Verwendung von Formularen und schriftlichen Eingabeaufforderungen ausdrücken, damit ein Mensch die Vorgänge erkennen kann, die er für einen Dienst ausführen darf.

Gibt es Formate, die für Kunden ähnliche Funktionen bieten?

Paul Turner
quelle
2
Das Problem beim Erkennen eines REST-Dienstes wurde hier diskutiert und beantwortet: stackoverflow.com/questions/9101494/… Die einfachste Lösung besteht darin, eine XHTML-Vorlage mit einem Formular zu verwenden, das nicht nur die von Ihnen verwendete Methode, sondern auch die Objektstruktur, die über die Formularelemente gesendet werden soll (Eingabe, Auswahl usw.). Clients benötigen lediglich einen XML-Parser, um das zu finden, was sie benötigen. Eine andere Möglichkeit sind URL-Vorlagen, die jedoch nur bei Ressourcen helfen, die Abfragezeichenfolgen enthalten.
Spoike
In Bezug auf Inhaltstypen; Dies wird durch Inhaltsverhandlungen gelöst , die in HTTP-Headern durchgeführt werden. Wenn der Server einen angeforderten Inhaltstyp nicht bereitstellen kann, sollte er einen HTTP-Fehler (z. B. 300 oder 406) zurückgeben, der angibt, welche Inhaltstypen zurückgegeben werden können.
Spoike

Antworten:

1

Wie würden Sie wissen, welche Eingaben akzeptabel sind? Das heißt, wenn Ihr Kunde keine Vorkenntnisse hat, wie würden Sie die Semantik von "Nachname" definieren? Du fängst an, in das Gebiet zu gelangen, in dem du so etwas wie Eule brauchst .

Ich denke, es ist praktischer zu erwarten, dass Ihre Kunden die Semantik bekannter Mimetypen verstehen. Sagen Sie zum Beispiel "text / vcard" für Personen.

Stephen J. Anderson
quelle
Ich denke, die Verwendung des Inhaltstyps ist der richtige Weg. Ich könnte meine Anwendung leicht ändern, application/atomapp+xmlum sie zu verwenden, und sie allen Kunden zur Verfügung stellen, die dieses Format bereits verstehen. Es gibt wahrscheinlich genug bekannte Inhaltstypen, um dies zu einer praktischen Lösung zu machen.
Paul Turner
Ich denke, der Kommentar von @Spoike ist ein eleganter REST-ian-Ansatz für die andere Hälfte des Problems. Selbst wenn der Client weiß, dass (zum Beispiel) ein Benutzer als vCard dargestellt wird, muss er dennoch wissen, welche Teilmenge der Eigenschaften des Benutzers für die Suche verfügbar ist.
Stephen J. Anderson
4

Sie können Details zu Ihren Diensten über eine "WADL" veröffentlichen.

http://en.wikipedia.org/wiki/Web_Application_Description_Language

Es ist optional und nicht jedes Backend-REST-Technos unterstützt dies. Jersey, die "offizielle" Java-Implementierung von jax-rs, unterstützt dies beispielsweise - es kann automatisch für Sie generiert werden.

Es ist jedoch ziemlich selten, dass es gebraucht wird.

Ich kenne keine großen, die es benutzen. Im Allgemeinen haben Sie eine Webseite, die die API beschreibt.

unludo
quelle
1
CXF ist eine weitere große Java JAX-RS-Implementierung, die WADL unterstützt, und Sie sehen jetzt auch einige interessante WADL-Konsumenten von Drittanbietern.
Donal Fellows