Você está na página 1de 14

05/04/2017 DataSnap:Transfernciadedadosentreaplicaescliente/servidor

www.devmedia.com.br
[versoparaimpresso]
Linkoriginal:http://www.devmedia.com.br/articles/viewcomp.asp?comp=27020

D a t a S n a p : T r a n s f e r n c ia d e d a d o
s e n t r e a p lic a e s c lie n t e / s e r v id o r
V e ja n e s t e a r t ig o c o m o t r a n s f e r ir d a d o s s im p le s ( S t r in g ,
In t e g e r, B o o le a n ) e n t r e a p lic a e s C lie n t e / S e r v id o r
u t iliz a n d o D a t a S n a p n o D e lp h i.

In tro d u o
Comaevoluodeaplicaesemtrscamadas,cadavezmaissetemanecessidade
detransferirdadosentreaplicaes,principalmentecomaevoluorpidados
dispositivosmveisquetrouxeumacomplexidadeamais,devidoasuadiversificao
deplataformaselinguagensqueasmesmasutilizam.Hojequemnoseadequara
essarealidade,ficaultrapassadonomercado.

Masmuitospodemseperguntar:Comotrocaressasinformaesentreasaplicaes
desenvolvidasemoutraslinguagens?Essaperguntanosimpeaumatomadade
deciso.Poistemosbasicamentedoistiposouformatosprincipaisdeintercmbiode
dados,JSONeXML.Masqualomelhorformatoparaseencapsularosdados?Vamos
analisaressesdoisformatosparatomarmosamelhordeciso.

Vamostransferirduasinformaesdetrspessoasparaumaaplicaocliente
qualquer,cujaessasinformaesseriam:NomeeIdade.

Pessoa01Nome:WelsonPlay,Idade:19
Pessoa02Nome:Stephanie,Idade:15
Pessoa03Nome:JooPedro,Idade:17

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27020 1/14
05/04/2017 DataSnap:Transfernciadedadosentreaplicaescliente/servidor

VamosencapsularprimeiramenteessesdadosemXMLparavermoscomoficaria:

Listagem1:FormataoemXML

<?xmlversion="1.0"encoding="ISO88591"?>
<Pessoas>
<Nome>WelsonPlay</Nome>
<Idade>19</Idade>
<Nome>Stephanie</Nome>
<Idade>15</Idade>
<Nome>JooPedro</Nome>
<Idade>17</Idade>
</Pessoas>

Agoravamosvercomosoencapsuladasasmesmasinformaes,squeagora
usandoJSON:

Listagem2:FormataoemJSON

{"Pessoas":[
{"Nome":"WelsonPlay","Idade":19},
{"Nome":"Stephanie","Idade":15},
{"Nome":"JooPedro","Idade":17}
]
}

Comopodemosver,aformataoemJSONbemmaissimplesdelermose
consequentementevaificarmuitomaisfcilparaamquinainterpretar,epoderser
atmaisrpidoparatransferirasinformaes.Entojpodemosconcluirquevamos
utilizarJSONparaointercmbiodosdados.

P r t ic a
VamosiniciarumnovoprojetoDataSnaputilizandooDelphiXE2,masquemtiveras
versesdoDelphi2010emdianteprovavelmentenoterqualquerproblemapara
acompanharesteartigo.

Vamosem:FileNewOther

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27020 2/14
05/04/2017 DataSnap:Transfernciadedadosentreaplicaescliente/servidor

Figura1:IniciandoumnovoProjeto

VamoscriarumnovoprojetocomowizarddoDataSnapqueestnapastaDataSnap
Server.CliquenaopoDataSnapServeredepoisemOk.Serabertoowizardonde
vamospassarasinformaesbsicasdefuncionamentodoservidor.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27020 3/14
05/04/2017 DataSnap:Transfernciadedadosentreaplicaescliente/servidor

Figura2:SelecionandooprojetoDataSnap

Observao:Noveremosemdetalhessobrecadaopoquetemnowizard,poisesse
noofocodesseartigo.

NaprimeirapartedowizardvamosescolherVCLFormsApplications.Comomostraa
figura3.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27020 4/14
05/04/2017 DataSnap:Transfernciadedadosentreaplicaescliente/servidor

Figura3:Etapa1de4naconfiguraodoServidor

CliqueemNext.

Naprximaetapadeixeopadroenaetapa3/4,selecioneumaportaqualquer.Nesse
exemplofoiescolhidaa8565.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27020 5/14
05/04/2017 DataSnap:Transfernciadedadosentreaplicaescliente/servidor

Figura4:Etapa3de4naconfiguraodoServidor

ClickemNext.Naetapa4/4deixecomoestecliqueemFinish.

Pronto.Jfoicriadoonossoprojeto.Foicriadopelowizardumform,umServer
MethoddeexemploeumServerContainer.

Parafacilitarodesenvolvimentoforamrenomeadasasunitsdaseguinteforma:

Antigonome NovoNome

Form1 UFViewPrincipal

ServerMethodsUnit USMMetodos

ServerContainerUnit USCServidor

Tabela1:Nomesdasunitsdoprojeto

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27020 6/14
05/04/2017 DataSnap:Transfernciadedadosentreaplicaescliente/servidor

VamoscriarummtodochamadofOlaMundonaunitUSMMetodoscomomostraa
listagem3.

Listagem3:PrimeiromtododetransfernciadedadosentreCliente/Servidor

{$METHODINFOON}
TSMMetodos=class(TComponent)
private
{Privatedeclarations}
public
{Publicdeclarations}
functionEchoString(Value:string):string;
functionReverseString(Value:string):string;

functionfAloMundo:TJSONValue;
end;
{$METHODINFOOFF}

NestemtodoserretornadoumstringsimplescomamensagemAlMundo.

Aimplementaodessemtodobemsimplescomomostraalistagem4,criandoum
objetodotipoTJSONStringepassadoostringAlmundo.

Listagem4:ImplementaodomtodofAloMundo

functionTSMMetodos.fAloMundo:TJSONValue;
begin
Result:=TJSONString.Create('Alomundo')
end;

Observao:ParautilizaraclasseTJSONStringdeveseadicionaraunitData.DBXJSON
paraversesdoDelphiXE2esuperiores,nasdemaisversesdeveseadicionaraUnit
DBXJSON.

VamosagoraadicionarumaaplicaoclienteselecionandooGrupoedepoiscomo
botodireitoselecionandoAddNewProject(Figura5).SelecionarapastaDelphi
ProjectedepoisclicaduasvezesemVCLFormsApplication,comomostraaFigura6.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27020 7/14
05/04/2017 DataSnap:Transfernciadedadosentreaplicaescliente/servidor

Figura5:Adicionandoumprojetocliente

Figura6:AdicionandoumaaplicaoCliente

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27020 8/14
05/04/2017 DataSnap:Transfernciadedadosentreaplicaescliente/servidor

ComoprojetojcriadovamosrenomearaunitdoFormparaUFViewPrincipaleonome
doformparaFViewPrincipal.

VamosAdicionarumTMemo,umTButtoneumaTSQLConnectionaoformevamos
renomearcomomostraaTabela2.

Nomedaclasse NovoNome

TMemo MJSON

TButton BGet

TSQLConnection SQLCServidor

Tabela2:Nomesdoscomponenetes

OrganizesuatelaparaquefiqueparecidocomaFigura7.

Figura7:Organizaodatela

VamosfazerasdevidasconfiguraesparaqueoSQLCServidorpossaseconectarcom
aaplicaoservidor.

Observao:NoentraremosemdetalhessobrecadapropriedadedoTSQLConnection,
poisessenoofocodoartigo.

VamosconfiguraraTSQLConnectionsegundoaTabela3.

Propriedade NovoValor

Drive Datasnap

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27020 9/14
05/04/2017 DataSnap:Transfernciadedadosentreaplicaescliente/servidor

Port 8565

Tabela3:ConfigurandoaspropriedadesdoTSQLConnection

CliquecomobotodireitonoSQLCServidoreemGenerateDataSnapclientclasses
comomostraaFigura8.

Figura8:GerandoClasseProxy

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27020 10/14
05/04/2017 DataSnap:Transfernciadedadosentreaplicaescliente/servidor

Pronto.SergeradaumaclasseProxyresponsvelporseconectarcomoservidor.
RenomeieaunitparaUProxy.VamosagoraimplementarobotoBGetcomomostraa
Figura13.

AimplementaodoeventoclickdoTButtonBGetbemsimplescomomostraa
imagemabaixo.

Listagem5:ImplementaodoTButtonBGet

procedureTFViewPrincipal.BGetClick(Sender:TObject);
varoProxy:TSMMetodosClient;//Classequerepresentameuservermoduledoservidor
begin
oProxy:=TSMMetodosClient.Create(SQLCServidor.DBXConnection);//CriandooObjetoProxy
try
MJSON.Text:=oProxy.fAloMundo.ToString;//ExecutandoafunofAloMundodoServidor
finally
oProxy.Free;//liberandooObjetoProxydamemria
end;
end;

Porpadro,aogeraroproxynoTSQLConnection,geradaumaclassenoladocliente
querepresentaasclassesquevoserconsumidanoladoclientecomomesmonome
daclassedoservidorconcatenadocomClient.

NaListagem5estsendodeclaradaumavariveldaclasserepresentativadaqueeu
vamosexecutarnoservidor.Emseguidaestsendocriadoonossoobjetoproxy,para
oqualpassadonoconstructoroDBXConnection.Esseobjetofuncionacomoo
endereodoservidor.Comoproxyjcriadobastachamaromtododoservidor,que
nonossocasoomtodofAloMundo,ondeomesmoretornaumtipoabstratodotipo
TJSONValueoqualpossuiummtodochamadoToStringqueconverteoobjetoem
JSONparastring.

Agoravamostestaroprograma.OseuresultadodeveserparecidocomodaFigura9
quandoforclicadonoTButtonBGet.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27020 11/14
05/04/2017 DataSnap:Transfernciadedadosentreaplicaescliente/servidor

Figura9:ResultadodomtodofAloMundo

AgoravamosvoltarparaoservidorevamoscriarumnovomtodochamadofSomar,
conformeaListagem6.

Listagem6:DeclaraodomtodofSomar

public
{Publicdeclarations}
functionEchoString(Value:string):string;
functionReverseString(Value:string):string;

functionfAloMundo:TJSONValue;
functionfSomar(constpValor1,pValor2:Integer):TJSONNumber;
end;

AgoravamosimplementaromesmocomonaListagem7:

Listagem7:ImplementaodoMtodofSomar

functionTSMMetodos.fSomar(constpValor1,pValor2:Integer):TJSONNumber;
variSoma:Integer;
begin
iSoma:=pValor1+pValor2;
Result:=TJSONNumber.Create(iSoma);
end;

Suaimplementaodispensagrandescomentrios,poissuaimplementaobastante
simples.Estosendosomadosdoisvaloreseemseguidapassadoparaoconstructor
doTJSONNumberoresultadodessasoma.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27020 12/14
05/04/2017 DataSnap:Transfernciadedadosentreaplicaescliente/servidor

AgoravamosparaoladoClienteevamosadicionarumnovoboto.Cujasua
implementaoestlogoabaixonaListagem8.

Listagem8:ImplementaodoTButtonfSomar

procedureTFViewPrincipal.BSomarClick(Sender:TObject);
varoProxy:TSMMetodosClient;//Classequerepresentameuservermoduledoservidor
begin
oProxy:=TSMMetodosClient.Create(SQLCServidor.DBXConnection);//CriandooObjetoProxy
try
MJSON.Text:=oProxy.fSomar(10,20).ToString;//ExecutandoafunofSomardoServidor
finally
oProxy.Free;//liberandooObjetoProxydamemria
end;
end;

AimplementaodoTButtonBSomarbemparecidacomadoTButtonBGete
dispensacomentrios,poisocdigofalaporsis.

AgoravamostestareverificaroResultado.OResultadodeveserparecidocomada
figura10.

Figura10:ResultadodafunofSomar

Comofoivistonosexemplosanteriores,noexistecomplicaoparatrafegartipos
primitivosentreaplicaescliente/Servidor.Tenteporsimesmodescobriro
funcionamentodosoutrostiposdeobjetosJSON,comooTJSONTrue,TJSONFalse,
TJSONArray,etc.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27020 13/14
05/04/2017 DataSnap:Transfernciadedadosentreaplicaescliente/servidor

Obs.:Valeressaltarqueoobjetivodesseartigoatransfernciadessasinformaes
entreaplicaesClient/Servidorenodeseaprofundaremcadatipo.

Agoravamosconsumiressemesmoservidornobrowserparasimularumambiente
hbrido.Parapoderconsumironossoservidornobrowservamosterqueadicionaro
suporteparaHTTPnomesmo.Paraissobastaadicionarocomponente
TDSHTTPServiceeefetuarasseguintesconfiguraesconformeaTabela4:

Propriedade NovoValor

Server DSServer1

HttpPort 1234

Tabela5:PropriedadesdocomponenteTDSHTTPService

VamosexecutaroservidornovamenteedigitaraseguinteURLnobrowserdesua
preferncia:http://localhost:1234/datasnap/rest/TSMMetodos/fAlomundo.

OResultadodeveserparecidocom:

Figura11:ResultadodomtodofAloMundo

IP:IPdaMquinaondeestexecutandooservidor.
Porta:aportaescolhidanopropriedadeHttpPortdocomponente
TDSHttpService.
Context:Sempredeveteressecontexto.
Classe:Nomedaclassedoservidoremquesequerconsumiromtodo.
Mtodo:Mtododaclassedoservidorpassadaanteriormenteemquesequer
consumir.

AgoravamosexecutaromtodofSomar.VamosescreverpraticamenteamesmaURL,
mascomadiferenaquevamosterquemudaromtodoparafSomaretemosque
passarosdoisparmetros:
http://localhost:1234/datasnap/rest/TSMMetodos/fSomar/10/30.

OResultadodeveserparecidocom:

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27020 14/14