Motivação

Quando desenvolvemos aplicações DataSnap, sejam elas utilizando VCL ou FireMonkey, precisamos construir no Delphi duas camadas de software: o cliente e o servidor. No servidor, estão concentrados os métodos remotos, que em geral são invocados para acessar dados e/ou executar operações sobre eles, retornando o resultado para o cliente. Em cenários como esse, uma maneira comumente empregada para trabalhar com os dois projetos (cliente e servidor), dentro do IDE do RAD Studio, é por meio dos grupos de projetos (Project Group), que têm a função de agrupar mais de um projeto na mesma instância do Delphi. Assim, não é necessário abrir uma nova instância do IDE para cada projeto.

Muitas vezes, no entanto, é preciso realizar a depuração dos métodos do servidor testando-os diretamente pela aplicação cliente, ou seja, precisamos executar o software cliente e, em paralelo, executar determinados métodos do servidor. Quando utilizamos o conceito de grupos de projetos, isso pode ser um problema, pois o IDE não permite que coloquemos breakpoints nos dois projetos e os mesmos sejam executados paralelamente. Deste modo, o conhecimento sobre uma técnica de depuração que permita a execução e debug simultâneo, tanto da aplicação cliente, quanto do servidor, é bastante útil.

Passo 1: Criando o servidor DataSnap

Para melhor organização do projeto, o primeiro passo é criar uma pasta chamada Servidor, na qual ficará armazenado o código fonte referente ao servidor de aplicação que conterá os métodos remotos, os quais serão posteriormente consumidos pela aplicação cliente. Para isso, deve-se acessar o menu File>New>Other e, na opção DataSnapServer, escolher DataSnap WebBroker Application. Essa opção permite que o servidor possa ser migrado para o Apache ou IIS (Internet Information Services), da Microsoft.

A Figura 1 apresenta a janela para criação do servidor, a qual contém cinco passos, referentes às opções do servidor. Na primeira etapa, deve ser selecionado Stand-alone application; na segunda, VCL application; na terceira e quarta etapas, devem ser mantidas as opções padrão; enquanto que na última deve ser escolhido TDSServerModule.

Criação do servidor DataSnap
Figura 1. Criação do servidor DataSnap

Após a conclusão do assistente, os seguintes arquivos devem ser salvos na pasta Servidor com os nomes padrão, ou seja: FormUnit1, ServerMethodsUnit1 e WebModuleUnit1. A exceção fica para o projeto (arquivo com extensão dproj), que deve ser salvo com o nome Servidor. Quando finalizamos a criação do projeto, automaticamente é criada uma janela para colocar o servidor no ar, conforme demonstra a Figura 2, para que assim as aplicações cliente possam fazer as requisições.

Execução do servidor DataSnap
Figura 2. Execução do servidor DataSnap

Ao acessar o código do arquivo ServerMethodsUnit1, é possível observar que foram geradas duas funções: EchoString e ReverseString. Essas funções servem apenas para teste de conexão com o servidor e são comumente utilizadas para se certificar que o servidor está rodando e retornando os resultados para a aplicação cliente. A primeira função recebe como parâmetro uma variável do tipo string e retorna o seu valor, enquanto a segunda faz a inversão dos caracteres, conforme pode ser observado na Listagem 1. Como demonstrado, caso seja passado o valor “delphi” para ela, o retorno será “ihpled”.


  01 function TServerMethods1.ReverseString(Value: string): string;
  02 begin
  03   Result := System.StrUtils.ReverseString(Value);
  04 end;
  05
  
Listagem 1. Código da função ReverseString

Passo 2: Criando o cliente DataSnap para acessar o servidor

Para criar o projeto cliente, clique com o botão direito em ProjectGroup1 e acesse a opção Add New Project, como demonstra a Figura 3. Feito isso, é preciso escolher Multi-Device Projects e Blank Application, para que um novo formulário seja adicionado.

Criação do projeto cliente
Figura 3. Criação do projeto cliente

Todos os arquivos devem ser salvos em uma pasta chamada Cliente, semelhante ao que fizemos com a pasta Servidor, com seus nomes padrão, com exceção do arquivo dproj, que deve ter o nome Cliente. No momento da criação do projeto, também será exibida uma janela para salvar o Project Group (extensão groupproj), que deve ter o seu nome mudado para Cliente e Servidor. Dessa forma, os dois projetos ficarão no mesmo grupo, o que facilita a codificação entre a aplicação servidora e a cliente. A Figura 4 apresenta a janela do Project Manager com todos os arquivos criados até o momento.

Project group
Figura 4. Project group

Precisamos agora acessar o servidor DataSnap. Para isso, é necessário criar um DataSnap REST Client Module no projeto cliente, por meio da opção File>New>Other, conforme expõe a Figura 5. Essa figura também mostra a primeira das três etapas para a criação do servidor, sendo escolhido Local server na primeira, WebBroker stand alone server na segunda e nenhuma configuração adicional na terceira. Ainda na última etapa, pode-se clicar no botão para testar a conexão e assim verificar se o servidor está acessível. É importante salientar, no entanto, que a aplicação servidora precisa estar em execução (botão Start da Figura 2).

Após o término do assistente, serão gerados dois novos arquivos: ClientClassesUnit1 e ClientModuleUnit1. O primeiro arquivo contém os métodos EchoString e ReverseString, que foram gerados no servidor, com a diferença que eles se conectam ao servidor DataSnap e obtêm o resultado de acordo com a codificação lá implementada.

Criação de cliente DataSnap
Figura 5. Criação de cliente DataSnap

Passo 3: Acessando o método do servidor

A Figura 6 apresenta a janela que devemos montar na aplicação cliente, e que fará a chamada ao método ReverseString no servidor. Note que ela é composta por um TEdit, um TButton e um TLabel. O objetivo, com isso, é digitar um texto na caixa de texto e, quando o botão for clicado, o método no servidor seja executado e o resultado, atribuído ao label.

Janela Cliente
Figura 6. Janela Cliente

Para que isso seja possível, primeiramente é necessário adicionar, na seção uses do formulário, a unit ClientModuleUnit1, a qual possui a propriedade ServerMethods1Client, responsável por dar acesso aos métodos remotos. Por fim, deve ser implementado o código a ser executado com o clique do botão (veja a Listagem 2).


  01 procedure TForm2.Button1Click(Sender: TObject);
  02 begin
  03   Label1.Text := ClientModule1.ServerMethods1Client.ReverseString(Edit1.Text);
  04 end;
  
Listagem 2. Código da função ReverseString

Linha 3: O label recebe o resultado da função que será executada no servidor; neste exemplo, a string invertida, conforme mostrado na Figura 6.

Passo 4: Debugando no cliente e no servidor

Apesar de a maneira padrão para manter dois projetos no RAD Studio ser utilizar os grupos de projetos, quando é necessário fazer a depuração de uma chamada de método no cliente, não é possível acompanhar a execução do código que está no servidor. Isso ocorre porque o IDE não permite que dois projetos abertos na mesma instância tenham breakpoints e sejam depurados em paralelo. A Figura 7 apresenta, em verde, a linha de código na qual houve a tentativa de colocar um ponto de parada, juntamente com o símbolo de erro no debug e a mensagem que o usuário recebe quando tenta fazer essa operação.

Erro no debug
Figura 7. Erro no debug

Essa restrição pode ser um problema para os desenvolvedores, pois em aplicações complexas é necessário executar o código no cliente e no servidor para que seja mais fácil encontrar erros no software.

Uma forma bastante simples de resolver isso é iniciar duas instâncias do Delphi e, em cada uma delas, abrir somente um projeto, sem utilizar o Project Group; ou seja, em uma instância do Delphi, abrir o projeto cliente, e na outra instância, abrir o projeto servidor. Dessa forma, os breakpoints podem ser criados e a mensagem de erro não será exibida.

A Figura 8 mostra os códigos no cliente, na parte superior, e no servidor, na parte inferior. A partir disso, quando o fluxo de execução do programa chegar ao clique do botão e o desenvolvedor apertar a tecla F8, automaticamente o fluxo de execução será direcionado para o código que está no servidor, sem a necessidade de configurações adicionais no IDE. Após o método do servidor DataSnap ser executado, automaticamente o fluxo de execução é novamente direcionado para a aplicação cliente.

Depuração no cliente e no servidor
Figura 8. Depuração no cliente e no servidor

Essa técnica de debug é bastante útil quando temos métodos mais complexos no servidor e precisamos fazer uma análise mais detalhada do seu comportamento e execução.