Estoy tratando de construir una API de descanso para una aplicación de Android. Supongamos que tengo una userstabla con (id, name, email)y una songstabla con (id, song_name, album)y una asociación de unión rica entre ellos como streamsteniendo (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:
GETque/streamsa buscar una lista de todos lossong_idseuser_ids. Luego, hagaGETpara/user/:idy/song/:idpara cada ID de usuario y canción para obtener la información de usuario y canción.GETque/streamsa buscar una lista de todos losuser_idsesong_ids. Entonces unoGETa/user?ids=<comma_separated_ids>en busca de información acerca de todos los usuarios y unaGETasong?ids=<comma_separated_ids>en busca de información acerca de todas las canciones.GETa/streamsy 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
/streamsinterfaz 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
GEToperación que devuelva metadatos sobre cada canción y usuario además de sus identificadores opacos.fuente
rest-fulldiseño, ¿verdad? AGETtostreamsdebería devolver todostreamsy nada más (incluso si son solo identificadores e inútiles para el cliente).streamsrecurso 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.