Estamos desenvolvendo uma API REST que, entre outras, será consumida por um front-end HTML5 via javascript. O aplicativo é para uso dentro da organização e geralmente possui cerca de 300 usuários, mas queremos escalar bem até 1000 usuários.
Normalmente, as conexões com a API serão feitas na LAN, para que a qualidade e a latência da conexão sejam boas, embora não seja excluído o uso ocasional na Internet, onde as conexões podem ser mais lentas e com mais atraso via 3G / 4G.
As duas opções que pensamos são:
O front-end fará várias chamadas assíncronas simultâneas para a API para carregar os vários componentes da interface.
- Prós: Simplicidade.
- Contras: Mais conexões com o servidor.
O controlador do front-end fará uma única chamada para a API passando como parâmetros que objetos precisam ser buscados.
- Prós: Apenas uma conexão com o servidor, embora o servidor faça várias conexões com o banco de dados.
- Contras: requer mecanismos no frontend e na API. Isso complica o design.
Explicações adicionais: Haverá recursos diferentes ... / Produto ... / Locais etc. Esses recursos podem ser buscados sozinhos, mas haverá outro recurso abstrato ... / tela? Produto e Locais que buscarão os dois em uma chamada.
/screen?Product&Locations
é uma abordagem ruim , pelo menos com toda a experiência que tenho desenvolvendo APIs REST e um aplicativo Web que as usou. De uma perspectiva monolítica pura (por exemplo, no Ruby on Rails), ter uma rota para/screen
carregar tanto recursosProduct
quantoLocation
recursos é perfeitamente adequado. No entanto, da perspectiva REST , você nunca desejará que uma rota carregue mais de uma (a menos que você esteja JOINING tables para obter mais dados de uma vez). O que/screen
deve fazer é carregar uma página básica de layout e você Ajax a sua API para obter os dados (Product
,Location
, etc)./screen
, o AJAX seráHTTP GET
para/products/popular
e/locations
). Sua API não deve ser a responsável por vários carregamentos, porque é improvável que você exiba os dados da mesma maneira em um aplicativo Web versus Android, por exemplo.