Escolar Documentos
Profissional Documentos
Cultura Documentos
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