Вы находитесь на странице: 1из 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

Оценить