27/11/2015DataSnap: Transferência de dados entre aplicações cliente/servidor www.devmedia.com.br [versão para impressão] Link original: http://www.devmedia.com.br/articles/viewcomp.asp?comp=27020 DataSnap: Transferência de dados entre aplicações cliente/servidor Veja neste artigo como transferir dados simples (String, Integer, Boolean) entre aplicações Cliente/Servidor utilizando DataSnap no Delphi. Introdução Com a evolução de aplicações em três camadas, cada vez mais se tem a necessidade de transferir dados entre aplicações, principalmente com a evolução rápida dos dispositivos móveis que trouxe uma complexidade a mais, devido a sua diversificação de plataformas e linguagens que as mesmas utilizam. Hoje quem não se adequar a essa realidade, fica ultrapassado no mercado. Mas muitos podem se perguntar: Como trocar essas informações entre as aplicações desenvolvidas em outras linguagens? Essa pergunta nos impõe a uma tomada de decisão. Pois temos basicamente dois tipos ou formatos principais de intercâmbio de dados, JSON e XML. Mas qual é o melhor formato para se encapsular os dados? Vamos analisar esses dois formatos para tomarmos a melhor decisão. Vamos transferir duas informações de três pessoas para uma aplicação cliente qualquer, cuja essas informações seriam: Nome e Idade. Pessoa 01 Nome: Welson Play, Idade: 19 Pessoa 02 Nome: Stephanie, Idade: 15 http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27020 1/16 {"Nome": "Stephanie". Idade: 17 Vamos encapsular primeiramente esses dados em XML para vermos como ficaria: Listagem 1: Formatação em XML <?xml version="1.devmedia.com. {"Nome": "João Pedro". mas quem tiver as versões do Delphi 2010 em diante provavelmente não terá qualquer problema para acompanhar este artigo.0" encoding="ISO‐8859‐1"?> <Pessoas> <Nome>Welson Play</Nome> <Idade>19</Idade> <Nome>Stephanie</Nome> <Idade>15</Idade> <Nome>João Pedro</Nome> <Idade>17</Idade> </Pessoas> Agora vamos ver como são encapsuladas as mesmas informações.27/11/2015 DataSnap: Transferência de dados entre aplicações cliente/servidor Pessoa 03 Nome: João Pedro. Prática Vamos iniciar um novo projeto DataSnap utilizando o Delphi XE2. e poderá ser até mais rápido para transferir as informações. só que agora usando JSON: Listagem 2: Formatação em JSON {"Pessoas" : [ {"Nome": "Welson Play".asp?comp=27020 2/16 . "Idade":19}. "Idade":17} ] } Como podemos ver. Vamos em: File New – Other http://www. a formatação em JSON é bem mais simples de lermos e consequentemente vai ficar muito mais fácil para a máquina interpretar. "Idade":15}. Então já podemos concluir que vamos utilizar JSON para o intercâmbio dos dados.br/articles/viewcomp_forprint. http://www.asp?comp=27020 3/16 . Será aberto o wizard onde vamos passar as informações básicas de funcionamento do servidor.27/11/2015 DataSnap: Transferência de dados entre aplicações cliente/servidor Figura 1: Iniciando um novo Projeto Vamos criar um novo projeto com o wizad do DataSnap que está na pasta DataSnap Server.devmedia. Clique na opção DataSnap Server e depois em Ok.com.br/articles/viewcomp_forprint. devmedia.com. http://www.asp?comp=27020 4/16 .br/articles/viewcomp_forprint. Como mostra a figura 3. pois esse não é o foco desse artigo.27/11/2015 DataSnap: Transferência de dados entre aplicações cliente/servidor Figura 2: Selecionando o projeto DataSnap Observação: Não veremos em detalhes sobre cada opção que tem no wizard. Na primeira parte do wizard vamos escolher VCL Forms Applications. br/articles/viewcomp_forprint. Na próxima etapa deixe o padrão e na etapa 3/4. http://www.asp?comp=27020 5/16 . selecione uma porta qualquer. Nesse exemplo foi escolhida a 8565.com.27/11/2015 DataSnap: Transferência de dados entre aplicações cliente/servidor Figura 3: Etapa 1 de 4 na configuração do Servidor Clique em Next.devmedia. Foi criado pelo wizard um form.com.br/articles/viewcomp_forprint.asp?comp=27020 6/16 . Na etapa 4/4 deixe como está e clique em Finish. Pronto. um Server Method de exemplo e um Server Container.27/11/2015 DataSnap: Transferência de dados entre aplicações cliente/servidor Figura 4: Etapa 3 de 4 na configuração do Servidor Click em Next.devmedia. Já foi criado o nosso projeto. Para facilitar o desenvolvimento foram renomeadas as units da seguinte forma: Antigo nome Novo Nome Form1 UFViewPrincipal ServerMethodsUnit USMMetodos ServerContainerUnit USCServidor Tabela 1: Nomes das units do projeto http://www. A implementação desse método é bem simples como mostra a listagem 4. {$METHODINFO OFF} Neste método será retornado um string simples com a mensagem “Alô Mundo”.fAloMundo: TJSONValue. Listagem 3: Primeiro método de transferência de dados entre Cliente/Servidor {$METHODINFO ON} TSMMetodos = class(TComponent) private { Private declarations } public { Public declarations } function EchoString(Value: string): string. nas demais versões devese adicionar a Unit DBXJSON. http://www.asp?comp=27020 7/16 .br/articles/viewcomp_forprint. como mostra a Figura 6.DBXJSON para versões do Delphi XE2 e superiores. Observação: Para utilizar a classe TJSONString devese adicionar a unit Data. Listagem 4: Implementação do método fAloMundo function TSMMetodos. function ReverseString(Value: string): string.devmedia.Create('Alo mundo') end. end. Vamos agora adicionar uma aplicação cliente selecionando o Grupo e depois com o botão direito selecionando Add New Project (Figura 5). function fAloMundo : TJSONValue. criando um objeto do tipo TJSONString e é passado o string “Alô mundo”.com. Selecionar a pasta Delphi Project e depois clica duas vezes em VCL Forms Application. begin Result := TJSONString.27/11/2015 DataSnap: Transferência de dados entre aplicações cliente/servidor Vamos criar um método chamado fOlaMundo na unit USMMetodos como mostra a listagem 3. br/articles/viewcomp_forprint.com.27/11/2015 DataSnap: Transferência de dados entre aplicações cliente/servidor Figura 5: Adicionando um projeto cliente Figura 6: Adicionando uma aplicação Cliente http://www.asp?comp=27020 8/16 .devmedia. Figura 7: Organização da tela Vamos fazer as devidas configurações para que o SQLCServidor possa se conectar com a aplicação servidor.br/articles/viewcomp_forprint. Vamos Adicionar um TMemo. um TButton e uma TSQLConnection ao form e vamos renomear como mostra a Tabela 2.asp?comp=27020 9/16 . pois esse não é o foco do artigo. Observação: Não entraremos em detalhes sobre cada propriedade do TSQLConnection. Vamos configurar a TSQLConnection segundo a Tabela 3.devmedia. Nome da classe Novo Nome TMemo MJSON TButton BGet TSQLConnection SQLCServidor Tabela 2: Nomes dos componenetes Organize sua tela para que fique parecido com a Figura 7.27/11/2015 DataSnap: Transferência de dados entre aplicações cliente/servidor Com o projeto já criado vamos renomear a unit do Form para UFViewPrincipal e o nome do form para FViewPrincipal.com. Propriedade Novo Valor Drive Datasnap http://www. 27/11/2015 DataSnap: Transferência de dados entre aplicações cliente/servidor Port 8565 Tabela 3: Configurando as propriedades do TSQLConnection Clique com o botão direito no SQLCServidor e em “Generate DataSnap client classes” como mostra a Figura 8.com.asp?comp=27020 10/16 . Figura 8: Gerando Classe Proxy http://www.devmedia.br/articles/viewcomp_forprint. O seu resultado deve ser parecido com o da Figura 9 quando for clicado no TButton BGet.fAloMundo. é gerada uma classe no lado cliente que representa as classes que vão ser consumida no lado cliente com o mesmo nome da classe do servidor concatenado com “Client”. A implementação do evento click do TButton BGet é bem simples como mostra a imagem abaixo. //liberando o Objeto Proxy da memória end.DBXConnection). //Executando a função fAloMundo do Servidor finally oProxy. Esse objeto funciona como o endereço do servidor. var oProxy : TSMMetodosClient.ToString. Vamos agora implementar o botão BGet como mostra a Figura 13.Create(SQLCServidor. // Criando o Objeto Proxy try MJSON. Com o proxy já criado basta chamar o método do servidor.asp?comp=27020 11/16 .devmedia.com. end. ao gerar o proxy no TSQLConnection.27/11/2015 DataSnap: Transferência de dados entre aplicações cliente/servidor Pronto.br/articles/viewcomp_forprint.Text := oProxy. Na Listagem 5 está sendo declarada uma variável da classe representativa da que eu vamos executar no servidor. Será gerada uma classe Proxy responsável por se conectar com o servidor. http://www. Agora vamos testar o programa. Por padrão. Renomeie a unit para UProxy.Free. // Classe que representa meu server module do servidor begin oProxy := TSMMetodosClient.BGetClick(Sender: TObject). Listagem 5: Implementação do TButton BGet procedure TFViewPrincipal. para o qual é passado no constructor o DBXConnection. que no nosso caso é o método fAloMundo. Em seguida está sendo criado o nosso objeto proxy. onde o mesmo retorna um tipo abstrato do tipo TJSONValue o qual possui um método chamado ToString que converte o objeto em JSON para string. Sua implementação dispensa grandes comentários. function fAloMundo : TJSONValue. end.Create(iSoma).fSomar(const pValor1. function fSomar(const pValor1. pois sua implementação é bastante simples. pValor2: Integer): TJSONNumber.com. end. Estão sendo somados dois valores e em seguida é passado para o constructor do TJSONNumber o resultado dessa soma. begin iSoma := pValor1 + pValor2.27/11/2015 DataSnap: Transferência de dados entre aplicações cliente/servidor Figura 9: Resultado do método fAloMundo Agora vamos voltar para o servidor e vamos criar um novo método chamado fSomar. http://www. conforme a Listagem 6. Result := TJSONNumber. function ReverseString(Value: string): string. var iSoma : Integer. pValor2 : Integer) : TJSONNumber. Listagem 6: Declaração do método fSomar public { Public declarations } function EchoString(Value: string): string. Agora vamos implementar o mesmo como na Listagem 7: Listagem 7: Implementação do Método fSomar function TSMMetodos.br/articles/viewcomp_forprint.devmedia.asp?comp=27020 12/16 . ToString.br/articles/viewcomp_forprint. etc.com. end. // Classe que representa meu server module do servidor begin oProxy := TSMMetodosClient.DBXConnection). Tente por si mesmo descobrir o funcionamento dos outros tipos de objetos JSON. como o TJSONTrue. // Criando o Objeto Proxy try MJSON. O Resultado deve ser parecido com a da figura 10. Listagem 8: Implementação do TButton fSomar procedure TFViewPrincipal. TJSONFalse. pois o código fala por si só. não existe complicação para trafegar tipos primitivos entre aplicações cliente/Servidor. Cuja sua implementação está logo abaixo na Listagem 8.Create(SQLCServidor.Free.fSomar(10.BSomarClick(Sender: TObject).devmedia. var oProxy : TSMMetodosClient. A implementação do TButton BSomar é bem parecida com a do TButton BGet e dispensa comentários.Text := oProxy. //Executando a função fSomar do Servidor finally oProxy. Agora vamos testar e verificar o Resultado. 20). //liberando o Objeto Proxy da memória end. TJSONArray.asp?comp=27020 13/16 . Figura 10: Resultado da função fSomar Como foi visto nos exemplos anteriores.27/11/2015 DataSnap: Transferência de dados entre aplicações cliente/servidor Agora vamos para o lado Cliente e vamos adicionar um novo botão. http://www. Vamos escrever praticamente a mesma URL. Para poder consumir o nosso servidor no browser vamos ter que adicionar o suporte para HTTP no mesmo.27/11/2015 DataSnap: Transferência de dados entre aplicações cliente/servidor Obs.br/articles/viewcomp_forprint. O Resultado deve ser parecido com: Figura 11: Resultado do método fAloMundo IP: IP da Máquina onde está executando o servidor. Para isso basta adicionar o componente TDSHTTPService e efetuar as seguintes configurações conforme a Tabela 4: Propriedade Novo Valor Server DSServer1 HttpPort 1234 Tabela 5: Propriedades do componente TDSHTTPService Vamos executar o servidor novamente e digitar a seguinte URL no browser de sua preferência: http://localhost:1234/datasnap/rest/TSMMetodos/fAlomundo. Porta: É a porta escolhida no propriedade HttpPort do componente TDSHttpService. Método: Método da classe do servidor passada anteriormente em que se quer consumir.: Vale ressaltar que o objetivo desse artigo é a transferência dessas informações entre aplicações Client/Servidor e não de se aprofundar em cada tipo. Context: Sempre deve ter esse contexto. Agora vamos consumir esse mesmo servidor no browser para simular um ambiente híbrido. Agora vamos executar o método fSomar.asp?comp=27020 14/16 .devmedia. mas com a diferença é que vamos ter que mudar o método para fSomar e temos que passar os dois parâmetros: http://localhost:1234/datasnap/rest/TSMMetodos/fSomar/10/30. Classe: Nome da classe do servidor em que se quer consumir o método.com. O Resultado deve ser parecido com: http://www. os resultados dos métodos estarão encapsulados em JSON. Para isso digite a seguinte URL no browser e vamos verificar o resultado em questão: http://localhost:1234/datasnap/rest/TSMMetodos/ReverseString/Welson Lembrando que o Result do método ReverseString não está em JSON. pois o DataSnap por padrão já faz esse encapsulamento dos tipos. já que internamente esse valores já são convertidos. não tendo a necessidade dos retornos serem em JSON. A prova disso é que os métodos de exemplos que já foram criados pelo wizard não retornam os valores propriamente em JSON. Vamos consumir o método ReverseString para exemplificar o que foi dito anteriormente.br/articles/viewcomp_forprint.27/11/2015 DataSnap: Transferência de dados entre aplicações cliente/servidor Figura 12: Resultado do método fSomar Não existe a necessidade do retorno dos métodos serem em JSON. Figura 13: Resultado do método fAloMundo http://www. O resultado obtido deve ser parecido com o da Figura 13.devmedia. ele retorna um tipo primitivo do próprio Delphi.com. mas se eles forem ser consumidos no browser.asp?comp=27020 15/16 . trabalho atualmente no desenvolvimento de sistemas web utilizando o ASP. e mais uma vez o Delphi entra em cena para facilitar a vida dos desenvolvedores. Ficamos por aqui. pois o DataSnap já faz essa conversão internamente.devmedia. Com esses conceitos que foram apresentados nesse artigo já podemos ter uma base para o desenvolvimento de aplicações híbridas e como foi visto. não é complicado realizar a troca de informações entre aplicações Cliente/Servidor.br/articles/viewcomp_forprint. críticas e sugestões para novos artigos.net e Delphi mais de quatro anos e possuo as certificações MCSD Web Developing e Delphi Developer. como o DataSnap trata esses dados e só então foi explicado que o Delphi já faz tudo isso internamente.asp?comp=27020 16/16 . Welson Play Sou Desenvolvedor . e isso acontece por que o DataSnap tem a capacidade de fazer essa conversão internamente.com. Conclusão Como foi visto nesse artigo introdutório. o resultado do método foi dado em JSON.27/11/2015 DataSnap: Transferência de dados entre aplicações cliente/servidor Como foi visto. e fiquem livres para escrever comentários. http://www. Mas claro que sempre é bom conhecer o que acontece nos bastidores e foi por isso que neste artigo foi mostrado primeiramente o que acontece internamente. Fiquem com Deus. não existe a necessita de ter muito conhecimento dos tipos em JSON.NET MVC na Lanlink Informática.
Report "DataSnap_ Transferência de Dados Entre Aplicações Cliente_servidor"