Estoy tratando de construir una API de descanso para una aplicación de Android. Supongamos que tengo una users
tabla con (id, name, email)
y una songs
tabla con (id, song_name, album)
y una asociación de unión rica entre ellos como streams
teniendo (user_id, song_id, listen_count)
. Quiero obtener detalles sobre todas las transmisiones y mostrarlas en la aplicación como una lista. La lista mostraría el nombre de la canción, el nombre del álbum, el nombre de usuario y el recuento de escucha. Veo tres opciones posibles:
GET
que/streams
a buscar una lista de todos lossong_ids
euser_ids
. Luego, hagaGET
para/user/:id
y/song/:id
para cada ID de usuario y canción para obtener la información de usuario y canción.GET
que/streams
a buscar una lista de todos losuser_ids
esong_ids
. Entonces unoGET
a/user?ids=<comma_separated_ids>
en busca de información acerca de todos los usuarios y unaGET
asong?ids=<comma_separated_ids>
en busca de información acerca de todas las canciones.GET
a/streams
y traiga todo en una sola llamada. Algo como -[ { "user_id" : 10, "song_id" : 14, "listen_count" : 5, "user" : { "id" : 10, "name" : "bla", "email" : "bla", }, "song" : { "id" : 14, "name" : "blu", "album" : "blu" } }, ... ]
Estoy tentado de ir con la opción 3 porque me da todo en una sola llamada, pero no creo que esté muy tranquilo y me temo que no será escalable. La opción 2 es buena pero requiere 3 llamadas, lo que significaría un tiempo considerable para cargar la lista. Y la opción 1 sigue al descanso, pero tomará numerosas llamadas para mostrar la lista y hacer tantas llamadas desde un dispositivo móvil no es factible.
¿Cuál sería la forma recomendada de hacer esto?
Respuestas:
Al crear una interfaz REST, no hay requisito, ni siquiera expectativa, de que las respuestas en la interfaz REST correspondan directamente a tablas o uniones en la base de datos.
Su
/streams
interfaz se puede representar tan fácilmente comoDonde los objetos JSON contienen los detalles principales de los usuarios y las canciones que son (casi) siempre relevantes para los consumidores de un recurso de transmisión, y un enlace a los recursos de usuario / canción relevantes si se necesitan más detalles.
Esto es esencialmente una variación de su tercera opción, con una alternativa a la opción 1 si se necesitan más detalles.
fuente
Course
->Teacher
(información sobre la persona como maestro, almacenada en una tabla separada) ->Person
(la persona física, como puede recordar, la misma persona podría ser maestra de varios cursos). La opción 2 es escalable y requiere * solicitud. También optar. 1 también es escalable, pero podría necesitar >> solicitud.Definitivamente desea una sola
GET
operación que devuelva metadatos sobre cada canción y usuario además de sus identificadores opacos.fuente
rest-full
diseño, ¿verdad? AGET
tostreams
debería devolver todostreams
y nada más (incluso si son solo identificadores e inútiles para el cliente).streams
recurso puede contener lógicamente (partes de) otros recursos. Las cosas que son lógicamente parte de un recurso deben estar presentes en la representación de ese recurso.