Você está na página 1de 16

27/11/2015 DataSnap:Transfernciadedadosentreaplicaescliente/servidor

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

DataSnap: Transferncia de
dados entre aplicaes
cliente/servidor
Veja neste artigo como transferir dados simples (String,
Integer, Boolean) entre aplicaes Cliente/Servidor
utilizando DataSnap no Delphi.

Introduo
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

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27020 1/16
27/11/2015 DataSnap:Transfernciadedadosentreaplicaescliente/servidor

Pessoa03Nome:JooPedro,Idade:17

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.

Prtica
VamosiniciarumnovoprojetoDataSnaputilizandooDelphiXE2,masquemtiveras
versesdoDelphi2010emdianteprovavelmentenoterqualquerproblemapara
acompanharesteartigo.

Vamosem:FileNewOther

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27020 2/16
27/11/2015 DataSnap:Transfernciadedadosentreaplicaescliente/servidor

Figura1:IniciandoumnovoProjeto

VamoscriarumnovoprojetocomowizaddoDataSnapqueestnapastaDataSnap
Server.CliquenaopoDataSnapServeredepoisemOk.Serabertoowizardonde
vamospassarasinformaesbsicasdefuncionamentodoservidor.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27020 3/16
27/11/2015 DataSnap:Transfernciadedadosentreaplicaescliente/servidor

Figura2:SelecionandooprojetoDataSnap

Observao:Noveremosemdetalhessobrecadaopoquetemnowizard,poisesse
noofocodesseartigo.

NaprimeirapartedowizardvamosescolherVCLFormsApplications.Comomostraa
figura3.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27020 4/16
27/11/2015 DataSnap:Transfernciadedadosentreaplicaescliente/servidor

Figura3:Etapa1de4naconfiguraodoServidor

CliqueemNext.

Naprximaetapadeixeopadroenaetapa3/4,selecioneumaportaqualquer.Nesse
exemplofoiescolhidaa8565.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27020 5/16
27/11/2015 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/16
27/11/2015 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/16
27/11/2015 DataSnap:Transfernciadedadosentreaplicaescliente/servidor

Figura5:Adicionandoumprojetocliente

Figura6:AdicionandoumaaplicaoCliente

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27020 8/16
27/11/2015 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/16
27/11/2015 DataSnap:Transfernciadedadosentreaplicaescliente/servidor

Port 8565

Tabela3:ConfigurandoaspropriedadesdoTSQLConnection

CliquecomobotodireitonoSQLCServidoreemGenerateDataSnapclientclasses
comomostraaFigura8.

Figura8:GerandoClasseProxy

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27020 10/16
27/11/2015 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/16
27/11/2015 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/16
27/11/2015 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/16
27/11/2015 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/16
27/11/2015 DataSnap:Transfernciadedadosentreaplicaescliente/servidor

Figura12:ResultadodomtodofSomar

NoexisteanecessidadedoretornodosmtodosserememJSON,poisoDataSnap
porpadrojfazesseencapsulamentodostipos,notendoanecessidadedos
retornosserememJSON,jqueinternamenteessevaloresjsoconvertidos.

Aprovadissoqueosmtodosdeexemplosquejforamcriadospelowizardno
retornamosvalorespropriamenteemJSON,masseelesforemserconsumidosno
browser,osresultadosdosmtodosestaroencapsuladosemJSON.

VamosconsumiromtodoReverseStringparaexemplificaroquefoidito
anteriormente.ParaissodigiteaseguinteURLnobrowserevamosverificaro
resultadoemquesto:
http://localhost:1234/datasnap/rest/TSMMetodos/ReverseString/Welson

LembrandoqueoResultdomtodoReverseStringnoestemJSON,eleretornaum
tipoprimitivodoprprioDelphi.

OresultadoobtidodeveserparecidocomodaFigura13.

Figura13:ResultadodomtodofAloMundo

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27020 15/16
27/11/2015 DataSnap:Transfernciadedadosentreaplicaescliente/servidor

Comofoivisto,oresultadodomtodofoidadoemJSON,eissoaconteceporqueo
DataSnaptemacapacidadedefazeressaconversointernamente,emaisumavezo
Delphientraemcenaparafacilitaravidadosdesenvolvedores.

Concluso
Comofoivistonesseartigointrodutrio,nocomplicadorealizaratrocade
informaesentreaplicaesCliente/Servidor.Comessesconceitosqueforam
apresentadosnesseartigojpodemosterumabaseparaodesenvolvimentode
aplicaeshbridasecomofoivisto,noexisteanecessitadetermuitoconhecimento
dostiposemJSON,poisoDataSnapjfazessaconversointernamente.Masclaro
quesemprebomconheceroqueacontecenosbastidoresefoiporissoqueneste
artigofoimostradoprimeiramenteoqueaconteceinternamente,comooDataSnap
trataessesdadosesentofoiexplicadoqueoDelphijfaztudoissointernamente.

Ficamosporaqui,efiquemlivresparaescrevercomentrios,crticasesugestespara
novosartigos.FiquemcomDeus.


WelsonPlay

SouDesenvolvedor.neteDelphimaisdequatroanosepossuoascertificaesMCSDWebDevelopinge
DelphiDeveloper,trabalhoatualmentenodesenvolvimentodesistemaswebutilizandooASP.NETMVCna
LanlinkInformtica.

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

Você também pode gostar