Frage

Ich bin die Gestaltung ein REST-API, wo einige Ressourcen können durch Abfrageparameter gefiltert werden. In einigen Fällen würden diese Filterwert Ressourcen aus dem gleichen REST-API. Dies macht für longish und ziemlich unleserlich URIs. Zwar ist dies nicht zu viel von einem Problem an sich ist, weil die URIs erstellt werden sollen und programmatisch manipuliert, macht es für einige schmerzhafte Fehlersuche. Ich dachte an als Filterwerte verwendet Verknüpfungen zu URIs erlauben, und ich frage mich, ob dies nach der REST-Architektur erlaubt ist und ob es irgendwelche Best Practices.

Zum Beispiel:

Ich habe eine Ressource, die mir Java-Klassen wird. Dann wird die folgende Anfrage würde ich alle Java-Klassen:

GET http://example.org/api/v1/class

Angenommen, ich möchte, dass alle Unterklassen der Collection Java-Klasse, dann würde ich die folgende Anforderung verwenden:

GET http://example.org/api/v1/class?has-supertype=http://example.org/api/v1/class/collection

Dieser Antrag zurückkehren würde mich Vector, ArrayList und alle anderen Unterklassen der Collection Java-Klasse.

Das URI obwohl ziemlich lang ist. Ich konnte es bereits für hs ermöglicht has-supertype als Alias ??verkürzen. Das würde mir:

GET http://example.org/api/v1/class?hs=http://example.org/api/v1/class/collection

Eine andere Möglichkeit, kürzere URIs zu ermöglichen, wäre Aliase für URI-Präfixe zu ermöglichen. Zum Beispiel könnte ich class als Alias ??für den URI-Präfix http://example.org/api/v1/class/ definieren. Welche mir folgende Möglichkeit geben würde:

GET http://example.org/api/v1/class?hs=class:collection

Eine andere Möglichkeit wäre es, die Klasse alias vollständig zu entfernen und immer den Parameterwert mit http://example.org/api/v1/class/ Präfix, da dies die einzige Sache ist, würde ich unterstützen. Dies würde sich die Anforderung für alle Subtypen von Collection in:

GET http://example.org/api/v1/class?hs=collection

Haben diese „Vereinfachungen“ der ursprünglichen Anforderung noch URI zu den Prinzipien einer REST-Architektur entsprechen? Oder habe ich abgehen nur die kalte Wasser?

NACHTRAG: Es könnte auf einmal in der URI mehr als ein Filter sein. Entweder als verschiedene Parameter oder als Liste von Werten für einen einzelnen Parameter. Denken Sie nach dem Vorbild der oder „Alle Klassen, die Schnittstelle X und sind im Paket A.B.C implementieren“ „Alle Klassen, die Schnittstelle X und / oder Y-Schnittstelle implementieren“ (wobei Pakete auch auf einen URI wie http://example.org/api/v1/packages/a/b/c adressierbar sein würden)

War es hilfreich?

Lösung

Ich würde gehen für die Herstellung von:

GET http://example.org/api/v1/class/java.util.Collection/subclasses

eine Liste von Links zu anderen Einträgen in der RESTful API, einen für jede direkte Unterklasse. Ich würde auch die Informationen zur Verfügung stellen als Teil der zurückgegebenen Deskriptor durch:

GET http://example.org/api/v1/class/java.util.Collection

(Das wäre auch ein Link auf die vorhergehenden spezifischen Abfrage.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top