Fala ai Radizeiros e Radizeiras, tudo bem com vocês?
Você já tentou disponibilizar seus dados na web e teve dificuldades?
Já perdeu diversos clientes por não ter seus dados disponíveis na nuvem?
Aqui no blog tem um artigo que falo de como criar um servidor de aplicação usando MVC, caso não tenha visto acesso aqui.
Neste post estarei mostrando como aplicar o GET no Servidor usando as boas práticas da programação.
Então vamos implementar a view do servidor DataSnap.
A View no servidor DataSnap não é um formulário, mas quando o usuário chamar no browser ou de qualquer aplicação a URI http://localhost:8080/datasnap/produto é onde o usuário está se comunicando com o servidor de aplicação, então esta é a nossa View do servidor de aplicação, ou seja, tudo que o mundo externo comunica coma aplicação.
Para criarmos um ServerMethod é muito simples no Delphi, vamos dar uma olhada no ServerMethod que já temos criado em nosso servidor de aplicação.
type {$METHODINFO ON} TServerMethods1 = class(TDSServerModule) private { Private declarations } public { Public declarations } function EchoString(Value: string): string; function ReverseString(Value: string): string; end; {$METHODINFO OFF} implementation {$R *.dfm} uses System.StrUtils; function TServerMethods1.EchoString(Value: string): string; begin Result := Value; end; function TServerMethods1.ReverseString(Value: string): string; begin Result := System.StrUtils.ReverseString(Value); end;
Se repararmos não tem nada de mais, a não ser da herança de TDSServerModule, porem ele poderia também está herdando de um DataModule comum.
Sendo assim iremos adicionar um DataModule em nosso projeto, e ele será meu ServerMethod que irá se comunicar com a camada de produtos, onde irei expor a minha tabela de produtos.
Iremos nomear esse DataModule para TProduto para facilitar quando chamarmos na URI, para que nossa URI não fique feiosa…
Essa nossa nova classe TProduto irá ter os métodos do DataSnap, os métodos que o DataSnap traduz pro protocolo, e neste post estaremos vendo o Get.
O que fazer para termos o Get no servidor?
Para fazermos um Get no nosso servidor é muito simples, basta termos um método do mesmo nome do objeto que iremos chamar:
{METHODINFO ON} type TProduto = class(TDataModule) private public function Produto (const Key : String) : TJsonArray; end; {METHODINFO OFF}
Em nosso método estamos retornando o TJsonArray , como estamos falando do protocolo REST, por convenção nós usamos o JSON, por ser um formato que qualquer aplicação de qualquer linguagem possa consumir as informações do nosso servidor de aplicação.
Desta forma nós já temos praticamente o Get pronto.
Você pode observar que estamos utilizando as diretivas de compilação {METHODINFO ON} e {METHODINFO OFF}, como estamos trabalhando diretamente com o DataModule eu preciso por essas diretivas para expor os métodos que estão dentro de nossa classe.
Nós poderíamos usar uma classe, nem pretisavamos de utilizar o DataModule, mas para sermos RAD criamos desta forma.
Quando o client chamar o Get do nosso servidor eu quero que nosso método Produto retorne um Array com todas as informações que tivermos em nossa tabela de produto, se passar algum parâmetro ele venha retornar somente o valor especifico.
Como essa nossa classe tem que trabalhar sempre utilizando o Controller.
No Create de nossa classe TProduto iremos instanciar o Controller.
... private FController : TController; ... procedure TProduto.DataModuleCreate(Sender : TObject); begin FController := TController.Create; end; procedure TProduto.DataModuleDestroy(Sender : TObject); begin FreeAndNil(FController); end; ...
Para que possamos ter acessos aos dados sem violarmos os padrões da programação funcional, estaremos criando nosso Get em nossa entidade de produto.
type TModelEntidadeProduto = class(TDataModule) private FDQuery : TFDQuery; public function Get (const Key : String = ''): TJSonArray; end; ... function TModelEntidadeProduto.Get (const Key : String = ''): TJSonArray; begin FDQuery.Close; FDQuery.SQL.Clear; FDQuery.SQL.Add('SELECT * FROM PRODUTO '); if Key <> '' then FDQuery.SQL.Add(' WHERE CODIGO = ' + Key); FDQuery.Open; Result := FDQuery.JsonArray; end;
Estamos agora traduzindo as informações vindas do banco e enviando a requisição para a nossa View.
Toda nossa regra de négocio agora está em nosso Model, agora em nossa View nós simplesmente chamamos o método Get passando o Key.
... function TProduto.Produto(const Key : String) : TJsonArray; begin Result := FController.Endidade.Produto.Get(Key); end; ...
Agora antes que nós venhamos testar nosso Get devemos dizer para o DataSnap que ele é um provedor de métodos.
Como vamos fazer isso?
Dentro do nosso WebModule nós temos dois componentes que são: DataSnapServer e o DataSnapServerClass.
No método OnGetClass do componente DataSnapServerClass, em seu método ele diz que o TServerMethod é uma classe provedora de métodos, nós simplesmente criamos uma cópia do DSServerClass2 e em seu OnGetClass iremos informar para o DataSnap que nossa classe é um provedor de métodos.
... procedure TWebModule1.DSServerClass2GetClass(DSServerClass: TDSServerClass; var PersistentClass: TPersistentClass); begin PersistentClass := DS.Model.Entidade.Produto.TProduto; end; ...
Agora com tudo isso pronto iremos iniciar nosso servidor DataSnap e iremos utilizar uma ferramente que acompanha o Delphi o RESTDebugger para testarmos nosso servidor de aplicação.
Veja que o RESTDebugger recebeu as informações convertida em JSON do nosso Get.
Mas como sempre em todo meu conteúdo nós temos uma dica legal…
Um dos grandes problemas que as pessoas reclamam muito do DataSnap é que ele não gera um JSON puro, ou seja, ele injeta o result, e quando nós vamos consumir em outras aplicações, em outros client da um trabalho para nós, e claro que irei deixar aqui o código que você pode usar para remover isso muito fácil.
Para fazer isso nó vamos em nosso WebModule.
No Componente DSRESTWebDispatcher1.
No Object Inspector no método OnFormatResult, que é onde iremos formatar o nosso retorno.
Iremos implementar esse código para que ele retire aquele result feio que vai pro nosso JSON.
... procedure TWebModule1.DSRESTDispatcher1FormatResult(Sender : TObject; var ResultVal : TJSONValue; const Command : TDBXCommand; var Handled : Boolean); var lcvJSONValue : TJSONValue; begin lcvJSONValue := ResultVal; try ResultVal := TJSONArray(lcvJSONValue).Remove(0); Finally lcvJSONValue.Free; end; Handled := True; end;
Mas o que esse código está fazendo?
Toda vez que ele for dar o result, ele irá pegar o valor do resul e irá remover o objeto 0 que é aquele result feio que aparece em nosso JSON, e depois ele continua o processo.
Vejo só como fica nosso retorno só com esse código que incluimos, vamos abrir o RESTDebugger e veja o retorno.
E melhor ainda, sem esse result, podemos ver no próprio RESTDebugger as informações em formato de tabela.
Agora temos nosso JSON puro e podemos visualizar e tratar essas informações em qualquer client sem medo…
Assim como este post e dicas como essa você pode encontrar em um dos meus treinamentos o de Aplicações RESTFUL com DataSnap
O QUE VOCÊ IRÁ APRENDER?
O treinamento de Datasnap Restful dará a você a oportunidade de melhorar seu desenvolvimento, otimizar o seu tempo e te dar a possibilidade de atender melhor os seus clientes.
Desenvolver um servidor de aplicação RestFul com Datasnap e utilizar todos os seus benefícios irá facilitar muito a sua vida, quando seu cliente disser “preciso dos meus dados na web hoje mesmo”, você estará preparado para entregar uma solução robusta e eficaz.
Nesse treinamento você irá aprender de forma prática a criar as principais rotinas de CRUD e Segurança para servidores RestFul Datasnap que podem ser consumidos de qualquer aplicação front-end.
CLIQUE AQUI E SAIBA MAIS SOBRE O TREINAMENTO RESTFUL COM DATASANP