Ich entwerfe eine REST-API, die von mehreren Clients verwendet wird, um ein Datenrepository abzufragen. Ich gehe davon aus, dass diese Kunden unterschiedliche Anforderungen hinsichtlich der Höhe/Detailliertheit der Antworten haben werden.Gute Methode für einen REST-API-Client, um die gewünschte Detailmenge der Antwort anzugeben?
Sagen wir, ich kann eine Sammlung von Büchern abfragen. Ein Buch könnte möglicherweise viele Attribute haben (mehr als jeder einzelne Client interessiert sein könnte), vielleicht sogar Unterressourcen, und ein Client könnte eine große Anzahl von Büchern anfordern, was zu einem Antworttextkörper führt, der größer als erforderlich ist.
Daher suche ich nach Möglichkeiten zur Optimierung der Antwortgröße. Die Idee ist, dem API-Client einige Mittel zu geben, um anzugeben, wie viele Details in die Antwort aufgenommen werden sollen.
Ich würde gerne erfahren, wie dieses Problem zuvor gelöst wurde; welcher Mechanismus in der Praxis gut funktioniert hat und welcher nicht, welches API-Design besonders RESTful ist und welches nicht, und so weiter.
ein paar Möglichkeiten, die ich denken kann ein Client, wie möglicherweise gewünschten Detaillierungsgrad für die Antwort geben konnte:
entweder mit dem
GET
oderHEAD
HTTP-Methode/Verb. Erstere würde alle Details zurückgeben, erstere nur eine Teilmenge.Dieser Ansatz ermöglicht uns nur die Unterscheidung zwischen zwei Detailebenen, daher ist er nur bedingt geeignet.
Mit einem Abfragezeichenfolgenparameter, der (nach Name) angibt, welche Eigenschaften/Attribute in der Antwort zurückgegeben werden sollen. Zum Beispiel:
GET /books?include=title,author,publisher,...,preview
Dies bietet nahezu unbegrenzte Flexibilität, aber eben diese Flexibilität könnte schwierig sein, tatsächlich umzusetzen und befassen sich mit (sowohl auf der Client- und Server-Seite).
Verwendung verschiedener Medientypen (ein eindeutiger Medientyp pro Detaillierungsgrad), ausgewählt über die Kopfzeile
Accept:
.Ich möchte nicht wirklich diesen Weg gehen. Ich bin mir nicht sicher, ob die Medientypen für diesen Zweck geeignet sind und die Welt wahrscheinlich sowieso nicht mehr benutzerdefinierte Medientypen benötigt.
Verwendung des
profile
Relation/Medientyp-Parameters. Dies scheint ein wenig besser (keine zusätzlichen Medientypen sind erforderlich), aber ich bin immer noch unsicher, ob Medientypen die richtige Methode für die Auswahl des "Was" (Inhalt) einer Antwort sind. Sie scheinen eher geeignet zu sein, das "Wie" (Format) der Antwort zu spezifizieren.Für Buchsammlungen (
/books?publishedIn=1980s
), nur eine kleine Teilmenge aller verfügbaren Daten zurückgegeben wird, was am wichtigsten ist einhref
für jedes Buch, die abgefragt werden können, die vollständigen Daten über ein Buch zu bekommen.Dieser Ansatz hat mindestens zwei Probleme:
Welche Attribute in Sammlung Antworten neben den
href
Links enthalten sind? Idealerweise gibt es gerade genug zusätzliche Daten, um die meisten Kunden zu befriedigen; sonst ...Die Kunden müssen viele zusätzliche Abfragen (eine pro Buch) durchführen, um alle Daten zu sammeln, die sie benötigen.
Es gibt möglicherweise mehr Strategien für den gewünschten Detaillierungsgrad auswählen. Ich bin interessiert zu erfahren, was in der Praxis gut funktioniert, ohne die REST-Fähigkeit zu sehr zu beeinträchtigen.
Ich habe in der Zwischenzeit GraphQL gefunden (http://Stackoverflow.com/a/41646020/240733)), das kommt dem sehr nahe, wonach ich gesucht habe. Allerdings akzeptiere ich Ihre Antwort, weil es einen gesunden Menschenverstand ergibt und wahrscheinlich viel einfacher zu implementieren ist. Vielen Dank! – stakx