Professional Documents
Culture Documents
Quando uma empresa precisa mover parte de seu sistema local para a WEB sempre existe a
dúvida da compatibilidade com outros sistemas e dispositivos. O REST praticamente encerra
com essa preocupação, pois não utiliza recursos específicos desta ou aquela linguagem ou
ambiente, ele utiliza os padrões WEB de comunicação. Dessa forma tem-se a certeza da
acessibilidade de informações.
Ao comparar a quantidade de texto fica claro o porquê da popularidade do padrão JSON entre
os serviços REST. Menos texto é igual a menor tamanho que é igual a menos tempo de
tráfego.
CRIANDO O PROJETO
CONFIGURAÇÕES INICIAIS DO SERVER
9. Salve todos módulos em pastas específicas de sua escolha. Neste manual, preferi não mudar
os nomes que o próprio Delphi da às units. Assim, serão criadas as units ServerContainerUnit1,
ServerMethodsUnits1, WebModuleUnit1 e algumas pastas que serão necessárias para o JSON.
CONSULTANDO DADOS
CRIANDO O DATAMODULE DO SERVIDOR E INSERINDO UMA QUERY DE BUSCA
1. Neste projeto que servirá como servidor, adicione um DataModule com uma Query para
consultar uma tabela ne um determinado banco de dados. Para o nosso exemplo, utilizaremos
o Firebird com um Banco de Dados que possui uma tabela chamada “CADPRODUTOS”.
2. Criaremos então uma Query chamada FDQProdutos que se conecta a um banco de dados para
fazer uma busca nesta tabela específica. Abaixo está o comando para a busca que passaremos
ao componente FDQProdutos:
select * from cadproduto where
cadproduto.id_produto
=:id
Como estamos utilizando do DataSnap Rest, duas units são criadas: uma é a Server Container e outra
é a Server Methods. Criaremos os procedimentos dentro do ServerMethods na área pública da classe
TServerMethods. Siga os passos abaixo para a criar a rotina de consulta no banco de dados:
1. Crie uma função na área pública da classe TServerMethods do ServerModule que servirá para
fazer a consulta da Query FDQProdutos no DM do Servidor. Esta função recebe um valor
inteiro como parâmetro (um id da tabela no BD) e retorna um TFDJSONDataSets. No nosso
exemplo chamaremos a função de BuscaProduto.
2. A princípio o Delphi não vai aceitar o retorno. Para isso basta adicionar as duas units
System.JSON e Data.FireDACJSONReflect.
DM.FDQProdutos.Active := False;
DM.FDQProdutos.Params[0].AsInteger := id_cliente;
DM.FDQProdutos.Active := True;
Os nomes aqui são da sua escolha, bem como as tabelas. Só estamos fazendo um exemplo de
consulta de dados por parâmetros, assumindo que você já conhece o processo.
4. Logo abaixo deste primeiro bloco, informaremos o result desta função, que será do tipo
TFDJSONDataSets. Este Result recebe a criação da classe TFDJSONDataSets.
Result := TFDJSONDataSets.Create;
5. Após feita a criação da classe TFDJSON podemos passar a escrever o conjunto de Dados na
forma JSON com o comando Writer:
TFDJSONDataSetsWriter.ListAdd(Result,DM.FDQProdutos);
Os dois parâmetros são primeiramente onde será escrito os dados em forma JSON e segundo
qual a fonte do conjunto de dados. A razão de usarmos o Writer é que estamos buscando
dados de uma Query e escrevendo em um JSONDataSet. Mais tarde, utilizaremos este
JSONDataSet para alimentar uma Tabela que será mostrada para o cliente.
DM.FDQProdutos.Active := True;
8. Feito isso podemos colocar o servidor para rodar e começar a fazer a aplicação cliente.
CRIANDO O DATA SNAP REST CLIENT MODULE PARA FAZER UMA CONSULTA
4. Agora entre no menu File > New > Other > DataSnap > DataSnap REST Client Module.
2. Faça um recorte-cole dos campos que você adicionou da Query FDQProdutos do servidor e
cole no Memtable do cliente.
Server para
Client
4. Criaremos agora a rotina para pesquisar os dados que está na tabela do servidor. Precisaremos
de uma variável do tipo TFDJSONDataSets que servirá para guardar as informações da busca.
Ela ficará no próprio evento do clique do botão. Esta variável receberá o procedimento que
está na classe ServerMethods da unit ClientClass. No projeto client, ao clicar no botão passe:
Dados representa a variável neste caso. Se o Delphi não reconhecer, é por que faltam as units
System.JSON e Data.FireDACJSONReflect.
Dados:=ClientModule1.ServerMethods1Client.RetornaCidade(StrToInt(edtBusca.Text));
Assert(TFDJSONDataSetsReader.GetListCount(Dados)=1);
A função Assert serve apenas como uma verificação para contar quantos itens há lista de dados
do JSON. Estamos igualando a um pois somente inserimos um pacote (ou lista), ou seja,
estamos passando apenas uma consulta.
TableProdutos.Active := False;
TableProdutos.AppendData(TFDJSONDataSetsReader.GetListValue(Dados,0));
TableProdutos.Active := True;
GRAVANDO DADOS
CRIANDO A FUNÇÃO GRAVAR NO SERVER
Criaremos agora a rotina para gravar um registro com o REST DataSnap. A lógica segue a mesma:
Primeiro criamos uma Query para executar o comando update. Criamos então uma função no Server
Methods passando como parâmetros os valores desejados e executamos o SQL da Query. Por fim
chamamos a função no botão do cliente. Antes de começar a criar a função do servidor, feche-o se
estiver rodando.
1. No DataModule do servidor, adicione uma Query para atualizar o registro que deseja e passe
o comando update. Chamaremos esta Query de GravarProdutos.
update
cadproduto
set
cadproduto.preco = :preco,
cadproduto.custo = :custo
where
cadproduto.id_produto =:id_produto
3. No Server Methods, crie uma função chamada GravarProduto na área pública da classe
TServerMethods. Esta função receberá um conjunto de dados do tipo TJSONDataSets e
retornará um Boolean.
function GravarCliente(ds_cliente:TFDJSONDataSets):Boolean;
DataModule1.TabelaProdutos.Active := False;
DataModule1.TabelaProdutos.AppendData(TFDJSONDataSetsReader.GetListValue(ds_Produtos,0));
DataModule1.GravarProduto.ParamByName('CUSTO').AsCurrency :=
DataModule1.TabelaProdutosCUSTO.AsCurrency;
DataModule1.GravarProduto.ParamByName('PRECO').AsCurrency :=
DataModule1.TabelaProdutosPRECO.AsCurrency;
DataModule1.GravarProduto.ParamByName('ID_PRODUTO').AsInteger :=
DataModule1.TabelaProdutosID_PRODUTO.AsInteger;
try
DataModule1.GravarProduto.ExecSQL;
Result := True;
Except
Result := False;
end;
Atenção! Perceba que estamos passando parâmetros em formato Currency. Se este é o caso,
devemos informar nas propriedades de cada campo do MemTable TabelaProduto a opção
currency marcada!
Agora chamaremos esta função no lado do cliente. É importante o servidor estar rodando e que o
componente de conexão do ClientModule esteja configurado com a mesma porta e ip do serviço.
ds_Produtos := TFDJSONDataSets.Create;
TFDJSONDataSetsWriter.ListAdd(ds_Produtos,DataModule2.TableProdutos);
Perceba que utilizamos a função Writer e adicionamos um item na lista. O primeiro parâmetro
é onde o será escrito e o segundo qual a fonte de dados a ser escrita.
ClientModule1.ServerMethods1Client.GravarProdutos(ds_Produtos,'');
Rode o cliente, faça uma busca, altere no dbgrid, grave e faça uma busca novamente deste
produto. Veja as alterações.
EXCLUINDO DADOS
CRIANDO A FUNÇÃO EXCLUIR NO SERVER
Criaremos agora a rotina para a exclusão de dados via REST DataSnap. Faremos o mesmo processo que
fizemos anteriormente criando uma Query para o comando de exclusão. Depois criamos a função no
servidor passando um parâmetro desejado e retornando um valor booleano. Após a criação da função
no Servidor passamos a chamá-la no Cliente.
1. No DataModule do Servidor, adicione uma Query e passe o comando SQL de exclusão. Para o
nosso exemplo chamaremos esta Query de ExcluiProduto.
delete from
cadproduto
where
cadproduto.id_produto = :id_produto
2. Crie agora na área pública da classe ServerMethods no uma função chamada ExcluiProduto.
Esta função receberá um valor inteiro e retornará um valor booleano. Como é óbvio, o valor
inteiro se destina para excluir o item da tabela.
function ExcluiProduto(id_produtos:Integer):Boolean;
try
DataModule1.ExcluiProduto.Active := False;
DataModule1.ExcluiProduto.ParamByName('ID_PRODUTO').AsInteger := id_produtos;
DataModule1.ExcluiProduto.ExecSQL;
Result := True;
except
Result := False;
end;
4. Feitas as alterações, agora podemos colocar o servidor para rodar e começar a programar o
cliente para chamar esta função.
ClientModule1.ServerMethods1Client.ExcluiProduto(DataModule2.TableProdutosID_PRODUTO.As
Integer);
INSERINDO DADOS
CRIANDO A FUNÇÃO INSERIR NO SERVER
Para finalizar este caso de estudo simples, vamos completar criando o procedimento inserir.
Seguiremos basicamente a mesma lógica dos procedimentos anteriores. Primeiro criamos a Quey para
o comando de inserção no DataModule do server. Depois criamos a função no ServerMethods. Criada
a função podemos ligar o servidor e gerar a função no ClientModule. Após isso basta criar um botão
no view do cliente e chamar a função do server.
1. Crie uma Query no DataModule do servidor chamada Inserir. Para o nosso exemplo
passaremos este comando:
insert into
cadproduto
values
(
:Id,
:Desc,
:grupo,
:custo,
:preco,
:cod,
:un
)
function InserirProduto(ds_Produtos:TFDJSONDataSets):Boolean;
DataModule1.TabelaProdutos.Active := false;
DataModule1.TabelaProdutos.AppendData(TFDJSONDataSetsReader.GetListValue(ds_Produtos,0)
);
DataModule1. InserirProduto.ParamByName('ID').AsInteger :=
DataModule1.TabelaProdutosID_PRODUTO.AsInteger;0
DataModule1. InserirProduto.ParamByName('DESC').AsString :=
DataModule1.TabelaProdutosDESCRICAO.AsString;
DataModule1. InserirProduto.ParamByName('GRUPO').AsString :=
DataModule1.TabelaProdutosGRUPO.AsString;
DataModule1. InserirProduto.ParamByName('CUSTO').AsFloat :=
DataModule1.TabelaProdutosCUSTO.AsFloat;
DataModule1. InserirProduto.ParamByName('PRECO').AsFloat :=
DataModule1.TabelaProdutosPRECO.AsFloat;
DataModule1. InserirProduto.ParamByName('COD').AsString :=
DataModule1.TabelaProdutosCODIGO.AsString;
DataModule1. InserirProduto.ParamByName('UN').AsString :=
DataModule1.TabelaProdutosUN.AsString;
6. Por fim utilizaremos try except para executar o comando SQL juntamente informando qual
será o Result:
try
DataModule1.InserirProduto.ExecSQL;
Result := True;
except
Result := False;
end;
7. Finalizamos a rotina no servidor. Agora coloque-o para rodar e vamos começar a programar a
rotina no cliente.
3. Na implementação, crie uma variável local do tipo TFDJSONDataSets, e passe a criação desta
classe para ela:
ds_Produtos := TFDJSONDataSets.Create;
4. Após a criação da classe nesta variável, utilizaremos o comando Write do JSON para incluir um
item na lista do conjunto de dados.
TFDJSONDataSetsWriter.ListAdd(ds_Produtos, DataModule2.TableProdutosID
O que acabamos de fazer foi preparar JSON para então assim receber o comando.