Design da API REST: várias chamadas versus uma única chamada para a API

18

Estamos desenvolvendo uma API Rest para site de comércio eletrônico, que será consumida por aplicativos móveis.

Na página inicial de um aplicativo, precisamos chamar vários recursos, como Sliders, Marcas Principais, Produtos Mais Vendidos, Produtos em Tendência etc.

Duas opções para fazer chamadas de API:

Chamada única:

www.example.com/api/GetAllInHome

Várias chamadas:

www.example.com/api/GetSliders

www.example.com/api/GetTopBrands

www.example.com/api/GetBestSellingProducts

www.example.com/api/GetTrendingProducts

Qual é a melhor abordagem para o design da API de descanso - chamada única ou múltipla, explique os prós e os contras?

O que levará mais tempo para responder à solicitação?

shaijut
fonte

Respostas:

14

Em teoria, as múltiplas chamadas simultâneas são mais flexíveis e rápidas.

No entanto, na prática, se você carregar uma página e, em seguida, carregar cada parte dessa página, exibindo carregadores giratórios por toda parte até obter os resultados, o resultado é lento e desarticulado.

Por esse motivo, as solicitações de dados do AJAX devem ser usadas com moderação e somente quando você tem uma seção da página que é lenta para carregar ou precisa ser atualizada em um ciclo diferente do restante da página. Diga uma exibição de mestre / detalhes, na qual você deseja selecionar uma opção do mestre e exibir os detalhes correspondentes sem recarregar o mestre.

Um design comum é manter as APIs separadas para flexibilidade de codificação e problemas de microsserviço, mas combinar o lado do servidor de dados no site. para que o cliente precise fazer apenas uma chamada para seu próprio site. As chamadas de API com armazenamento em cache apropriado devem ser rápidas no datacenter.

Além disso, considere não ter nenhuma chamada de API do cliente. basta gerar o lado do servidor HTML. Embora as estruturas de aplicativos de página única javascript o levem ao caminho da API. Geralmente, não é a abordagem ideal para sites de comércio eletrônico de alto volume.

insira a descrição da imagem aqui

Ewan
fonte
Obrigado, na verdade Esta API é consumida em aplicativos para Android e para telefone. Quero saber quando a página inicial do aplicativo é carregada. Devo obter todos os recursos, como: controles deslizantes, marcas, produtos em uma única API ou fazer uma chamada individual à API para obter recursos individuais quando usuários rola para baixo?
shaijut
A mesma lógica se aplica, minimize as chamadas simultâneas onde não for necessário. Um aplicativo oferece um pouco mais de flexibilidade para baixar informações em segundo plano. Você pode querer mudar para uma abordagem GetChangesSInce (data)
Ewan
Portanto, você conclui que é melhor ter uma API única para solicitar a resposta de todos os recursos da página inicial de uma só vez, quando a página inicial do aplicativo for carregada e ter diferentes APIs para sliders, marcas etc. separadamente para microsserviço quando você tiver uma seção da página a ser atualizada ?
shaijut
a não ser que você tenha uma boa razão para que essas seções não são apenas carregado com os dados da página / main
Ewan
Última pergunta: como funcionam aplicativos como Amazon, Flipkart? Eles não carregam todos os recursos da página inicial em uma única chamada quando o usuário abre o aplicativo? Eu quero saber qual seria a melhor abordagem para isso.
shaijut
5

TL; DR: Todas as outras considerações de aplicativos à parte, a realização de uma única chamada seria mais rápida que a realização de várias chamadas. Executar as chamadas de forma assíncrona pode reduzir o tempo total necessário para concluir uma determinada operação da perspectiva do usuário (que pode ser tudo o que você precisa), mas, em conjunto, o tempo necessário ainda será mais longo para várias chamadas.

No seu caso, no entanto, não tenho certeza se essa é a história completa.

APIs REST são um termo um pouco ambíguo, devido a várias interpretações do artigo que popularizaram a ideia. Mesmo pela interpretação mais liberal do que constitui uma API REST, o que você tem não se encaixa realmente.

O princípio básico é que você possui um recurso no qual deseja executar uma ação. O URI identifica o recurso no qual você está interessado, e você normalmente usaria os verbos HTTP para indicar o que deseja fazer com esse recurso.

No seu caso específico, todos os seus métodos têm a palavra 'get' em seu nome. Você deve alterar o verbo usado na solicitação HTTP para indicar que deseja 'obter' o recurso disponível nesse local.

Seu esquema de URI deve representar a hierarquia lógica dos recursos que você deseja disponibilizar para os usuários da sua API. Portanto, no seu caso, eu consideraria usar algo como /api/products?category=sliderspara filtrar sua coleção de produtos. Isso significa que quando os clientes desejam obter todos os seus produtos, eles podem simplesmente omitir a string de consulta.

richzilla
fonte
Obrigado, então você quer dizer único urlpara API, mas a solicitação deve ser feita com recursos diferentes usando Query String? , verifique também isso .
shaijut
Sim, executar suas chamadas de forma assíncrona reduziria o tempo absoluto necessário para buscar os dados, mas, agregado, o tempo gasto ainda será maior; Mais chamadas precisam repetir a sobrecarga de uma conexão TCP e um ida e volta de comunicações. Mesmo usando recursos como o keep-alivearent vai remover isso completamente.
91317 richzilla
A categoria seria uma propriedade de um recurso de produto individual. Logicamente você estaria buscando uma coleção de produtos e filtragem de todos aqueles com a categoria especificada
richzilla
quer dizer, quando o usuário abre a página inicial do aplicativo, uma chamada deve ir para a API que retorna todos os recursos mencionados acima? ou quando ele rola chamadas individuais devem ser feitas para recursos específicos, qual é a melhor prática?
21417 shaijut às
Depende do que o usuário espera ver em cada ponto do seu aplicativo. Tome este site, por exemplo, quando você clica em questionsvocê vê a URI é /questions, quando você clica em uma das suas marcas favoritas, a URI é/questions/tagged/<tagname>
richzilla