Ich versuche eine Rest-API für eine Android-App zu erstellen. Angenommen , ich habe eine users
Tabelle mit (id, name, email)
und einen songs
Tisch mit (id, song_name, album)
und eine reiche verbinden Verbindung zwischen ihnen als streams
mit (user_id, song_id, listen_count)
. Ich möchte Details zu allen Streams abrufen und in der App als Liste anzeigen. Die Liste würde den Songnamen, den Albumnamen, den Benutzernamen und die Höranzahl anzeigen. Ich sehe drei plausible Optionen -
GET
auf/streams
und eine Liste aller Abrufsong_ids
unduser_ids
. Machen Sie dannGET
zu/user/:id
und/song/:id
für jeden Benutzer und jede Song-ID, um die Benutzer- und Song-Informationen zu erhalten.GET
auf/streams
und eine Liste aller Abrufuser_ids
undsong_ids
. Dann , einesGET
zu/user?ids=<comma_separated_ids>
holen Informationen über alle Benutzer undGET
zusong?ids=<comma_separated_ids>
Informationen über alle Songs zu holen.GET
zu/streams
und alles in einem Aufruf zu holen. Etwas wie -[ { "user_id" : 10, "song_id" : 14, "listen_count" : 5, "user" : { "id" : 10, "name" : "bla", "email" : "bla", }, "song" : { "id" : 14, "name" : "blu", "album" : "blu" } }, ... ]
Ich bin versucht, Option 3 zu wählen, weil es mir alles in einem Anruf gibt, aber ich denke nicht, dass es sehr ruhig ist und ich befürchte, dass es nicht skalierbar ist. Option 2 ist gut, aber es sind 3 Anrufe erforderlich, was ein erhebliches Laden der Liste bedeuten würde. Und Option 1 folgt auf Ruhe, nimmt jedoch zahlreiche Anrufe entgegen, um die Liste anzuzeigen, und so viele Anrufe von einem mobilen Gerät aus sind nicht möglich.
Was wäre der empfohlene Weg, um dies zu tun?
Antworten:
Beim Erstellen einer REST-Schnittstelle besteht keine Anforderung oder Erwartung, dass die Antworten auf der REST-Schnittstelle direkt Tabellen oder Verknüpfungen in der Datenbank entsprechen.
Ihre
/streams
Benutzeroberfläche kann genauso einfach dargestellt werden wieWobei die JSON-Objekte die Hauptdetails von Benutzern und Songs enthalten, die (fast) immer für Verbraucher einer Stream-Ressource relevant sind, und einen Link zu den relevanten Benutzer- / Song-Ressourcen, wenn weitere Details benötigt werden.
Dies ist im Wesentlichen eine Variation Ihrer dritten Option, mit einem Rückgriff auf Option 1, wenn weitere Details benötigt werden.
quelle
Course
->Teacher
(Informationen über die Person als Lehrer, gespeichert in einer separaten Tabelle) ->Person
(die physische Person, wie Sie sich erinnern können, könnte dieselbe Person Lehrerin mehrerer Kurse sein). Option 2 ist skalierbar und erfordert eine * Anforderung. Auch opt. 1 ist ebenfalls skalierbar, benötigt jedoch möglicherweise eine >> Anforderung.Sie möchten auf jeden Fall eine einzelne
GET
Operation, die zusätzlich zu ihren undurchsichtigen IDs Metadaten zu jedem Song und Benutzer zurückgibt .quelle
rest-full
Design, oder? EinGET
tostreams
sollte allesstreams
und nichts zurückgeben (auch wenn es sich nur um IDs handelt und für den Client nutzlos ist).streams
Ressource kann logisch (Teile) anderer Ressourcen enthalten. Dinge, die logisch Teil einer Ressource sind, sollten in der Darstellung dieser Ressource vorhanden sein.