Estou tentando criar uma API de descanso para um aplicativo Android. Suponha que eu tenha uma users
tabela com (id, name, email)
e uma songs
tabela com (id, song_name, album)
e uma associação de junção rica entre eles como streams
tendo (user_id, song_id, listen_count)
. Quero buscar detalhes sobre todos os fluxos e mostrá-lo no aplicativo como uma lista. A lista mostraria o nome da música, o nome do álbum, o nome do usuário e a contagem de escutas. Eu vejo três opções plausíveis -
GET
para/streams
e buscar uma lista de todos ossong_ids
euser_ids
. Em seguida, façaGET
para/user/:id
e/song/:id
para cada usuário e ID da música para obter informações sobre o usuário e a música.GET
para/streams
e buscar uma lista de todos osuser_ids
esong_ids
. Então, umGET
para/user?ids=<comma_separated_ids>
buscar informações sobre todos os usuários e umGET
parasong?ids=<comma_separated_ids>
buscar informações sobre todas as músicas.GET
para/streams
buscar tudo em uma chamada. 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" } }, ... ]
Sinto-me tentado a optar pela opção 3 porque ela me dá tudo em uma ligação, mas não acho que seja muito tranquila e temo que não seja escalável. A opção 2 é boa, mas são necessárias três chamadas, o que significaria um tempo considerável para carregar a lista. E a opção 1 segue o resto, mas atenderá inúmeras chamadas para mostrar a lista e fazer tantas chamadas de um dispositivo móvel não é viável.
Qual seria a maneira recomendada de fazer isso?
Respostas:
Ao criar uma interface REST, não há nenhum requisito, ou mesmo expectativa, de que as respostas na interface REST correspondam diretamente às tabelas ou junções no banco de dados.
Sua
/streams
interface pode ser tão facilmente representada quantoOnde os objetos JSON contêm os principais detalhes de usuários e músicas que são (quase) sempre relevantes para os consumidores de um recurso de fluxo e um link para os recursos relevantes de usuário / música, se mais detalhes forem necessários.
Essa é essencialmente uma variação da sua terceira opção, com um substituto para a opção 1, se mais detalhes forem necessários.
fonte
Course
->Teacher
(informações sobre a pessoa como professor, armazenadas em uma tabela separada) ->Person
(a pessoa física, como você pode se lembrar, a mesma pessoa pode ser professora de vários cursos). A opção 2 é escalável e requer * solicitação. Também optar. 1 também é escalável, mas pode precisar de >> solicitação.Você definitivamente deseja uma
GET
operação única que retorne metadados sobre cada música e usuário, além de seus IDs opacos.fonte
rest-full
design, não é? AGET
tostreams
deve retornar todostreams
e nada mais (mesmo que sejam apenas ids e inúteis para o cliente).streams
recurso pode conter logicamente (partes de) outros recursos. Coisas que são logicamente parte de um recurso devem estar presentes na representação desse recurso.