Como buscar dados de servidores DataSnap utilizando JSON

Veja neste artigo como criar métodos para listar dados no aplicativo cliente utilizando DataSnap.

Motivação

Há vários anos, a arquitetura padrão para o desenvolvimento de software foi o modelo cliente e servidor de duas camadas. Porém, com o grande advento dos dispositivos móveis, essa arquitetura já não é a mais adequada para várias aplicações. Isso ocorre porque pode ser custoso manter componentes de acesso a dados nos próprios aplicativos, visto que recursos de segurança e controles específicos do servidor precisam ser implementados manualmente. Por esses motivos é que se faz necessária uma arquitetura de software mais robusta para tais casos, e o modelo multicamadas utilizando a tecnologia de DataSnap traz a solução para esse problema.

Nesse modelo, é função do servidor de aplicação DataSnap manter todas as conexões com a base de dados, bem como todo o processamento das regras de negócio. Já à aplicação cliente caberá consumir os métodos que são expostos pelo servidor, obtendo assim os dados necessários a seu funcionamento. Nesse artigo nos concentraremos em como criar, no aplicativo cliente, métodos para listar dados provenientes do servidor DataSnap.

Passo 1: Criando o método no servidor

Quando criamos servidores DataSnap, automaticamente é gerada uma unit chamada ServerMethodsUnit, na qual devemos programar os métodos remotos que retornarão os dados para a aplicação cliente. Essa mesma unit também apresenta um visual muito semelhante ao um Data Module, e nela os componentes de acesso a dados devem ser adicionados. A Figura 1 mostra esses componentes: um FDConnection para realizar a conexão com a base de dados, um FDQuery para buscar os dados utilizando a SQL, o driver do banco de dados (FDPhysMSSQLDriverLink) e um FDStanStorageJSONLink, para permitir que os dados trafeguem pela rede no formato JSON.

Nesse exemplo estamos utilizando a engine FireDAC para acesso a dados e o SQL Server como sistema gerenciador de banco de dados. No entanto, caso necessário, outras tecnologias poderiam ser utilizadas de forma similar.

Figura 1. Componentes de acesso a dados

Tendo adicionado os componentes, podemos ver agora, na Listagem 1, a codificação para executar uma consulta no servidor e retornar os dados para a aplicação cliente. É importante frisar que deve-se adicionar na cláusula uses dessa unit o namespace Data.FireDACJSONReflect.

Listagem 1. Função para buscar os dados do servidor
public function RetornaRegistros(): TFDJSONDataSets; end; function TServerMethods1.RetornaRegistros: TFDJSONDataSets; begin FDQuery1.Active := False; Result := TFDJSONDataSets.Create; FDQuery1.SQL.Text := "select * from pessoas"; TFDJSONDataSetsWriter.ListAdd(Result, FDQuery1); end;

Passo 2: Criando o método no cliente

Quando criamos clientes DataSnap, são gerados automaticamente pelo assistente do RAD Studio dois arquivos: ClientClasses e ClientModule. O primeiro é uma abstração de todos os métodos que foram definidos no servidor, enquanto o segundo efetivamente realiza as conexões entre a aplicação cliente e a aplicação servidora. A Figura 2 apresenta a interface gráfica, que é composta de um botão (TButton), um memo (TMemo), uma tabela em memória (FDMemTable1) e novamente o componente para permitir tráfego de arquivos JSON (FDStanStorageJSONLink1). O objetivo dessa interface é que quando o botão for clicado, será executada uma consulta utilizando o método do passo anterior, os resultados serão copiados para a tabela em memória e posteriormente listados no memo. É importante lembrar que é necessário informar na cláusula uses do formulário as units Data.FireDACJSONReflect e ClientModuleUnit1.

Figura 2. Interface gráfica do cliente.

Por fim, o código da Listagem 2 mostra como fazer o download dos dados do servidor e realizar a listagem.

Listagem 2. Download dos dados do servidor
procedure Tform2.Button1Click(Sender: TObject); var dataset: TFDJSONDataSets; begin dataset := ClientModule1.ServerMethods1Client.RetornaRegistros(); FDMemTable1.Active := false; FDMemTable1.AppendData(TFDJSONDataSetsReader.GetListValue(dataset, 0)); FDMemTable1.Active := true while not FDMemTable1.Eof do begin Memo1.Lines.Add(FDMemTable1.FieldByName("nome").AsString); FDMemTable1.Next; end; end;

Com isso, temos uma estrutura em DataSnap que faz a leitura dos dados no servidor e os copia para uma aplicação cliente. Conforme discutido anteriormente, essa codificação é comumente utilizada para trazer dados para aplicativos mobile utilizando um servidor de aplicação.

Artigos relacionados