
Última atualização em 9 de outubro de 2024 por Willian Tuttoilmondo
Fundações
Uma boa construção, independente do que seja, começa por uma boa fundação. Sejam, prédios, casas ou, até mesmo, aplicações. Se para uma casa ou prédio sólido e confiável é necessária uma fundação igualmente sólida, por que para uma aplicação seria diferente? Se formos aplicar esse conceito ao nosso meio, uma boa fundação é estabelecer uma base sólida para uma aplicação, a qual é responsável por dar sustentação a todas as necessidades dela. Uma das formas mais eficientes de prover essa base é fornecendo um estrutura de APIs (do Inglês Application Programming Interface – Interface de Programação de Aplicação) que possam ser integradas a aplicações que serão utilizadas para seu consumo. Uma das formas mais populares de se obter essa base é utilizar uma arquitetura RESTful para o provimento desses acessos. Uma dessas formas é desenvolver APIs RESTful com Delphi e DataSnap, o que possibilita a distribuição de produtos compilados e invioláveis, ao contrário do que acontece com o PHP, por exemplo, onde os fontes são distribuídos com o container caso haja a necessidade da distribuição do produto para instalações On-Premises.
Uma das alternativas mais interessantes para realizar um projeto como esses é a criação de uma API que possa ser abrigada no popular e consagrado servidor Web Apache. Como o Delphi nos provê a possibilidade de criar módulos para o Apache, essa é a forma mais amigável e segura de desenvolver APIs RESTful com Delphi e DataSnap. Há, inclusive, um wizard que facilita a criação de módulos Apache que abrigarão as APIs RESTful que serão criadas. Sendo assim, vamos ao trabalho.
Ah! As partes II, III e IV deste artigo contém as partes relativas à codificação, deploy e implementação da nossa API. Não deixe de conferir! E se você quiser o código fonte desse projeto, o link está na parte IV do artigo.
Criando APIs RESTful com Delphi e Datasnap
É importante lembrar que, para um projeto como esse, é necessária uma instalação Delphi Enterprise ou Archtect, já que as versões Community e Professional não contam com o framework DataSnap. Se você não possui uma versão dessas, é possível fazer um teste de 30 dias com as versões oficiais do produto, bastando fazer o download no site oficial do produto.
Então, para iniciarmos nosso projeto, que no meu caso foi desenvolvido na versão Sydney (10.4.2), é preciso acessar o menu File->New->Other… para acessar as opções de projetos que podem ser criados. Na imagem abaixo, temos a janela de opções de projetos.

Para que possamos criar nosso projeto, devemos selecionar a opção DataSnap. Nela, temos as opções de DataSnap REST Application, DataSnap Server e DataSnap WebBroker Application. Pela facilidade de uso e pela forma como serão desenvolvidas as APIs, nossa melhor opção é a primeira, já que esta se destina a criar aplicações REST.
As demais opções também ajudam a criar aplicações DataSnap, mas com focos diferentes, os quais podemos abordar em artigos futuros. O importante é ter em mente que, para um projeto simples e funcional, alguns conceitos já devem estar estabelecidos. Um desses conceitos é a utilização de padrões de projeto, o qual já discutimos anteriormente. Outro conceito que será amplamente utilizado aqui é o conceito de class helpers, que também já vimos em outro momento. Estes não são conceitos novos, mas são importantíssimos para a criação de APIS RESTful com Delphi e DataSnap. Se você ainda não leu os artigos que tratam sobre esse conceito, sugiro que gaste um tempinho se dedicando a essa leitura.
Após selecionar a opção indicada, o Delphi dará início ao seu wizard de configuração do projeto. Esse wizard nos guiará de forma a criar um projeto simples, no qual faremos a implementação de nossa API. A primeira tela deste ajudante nos dá a opção de selecionar as plataformas para as quais desenvolveremos nossa API.

Por questões práticas, a opção Windows já vem marcada e não pode ser desmarcada. Contudo, temos a opção Linux – que se mostra bem interessante, uma vez que servidores Apache Linux são muito comuns em provedores de serviço Web -, a qual pode ser ou não marcada nessa fase. É importante lembrar que, para compilações para Linux, é necessário montar o SDK de compilação para a plataforma. Eu obtive ótimos resultados montando o SDK com a distribuição Slackware 14.2, mas não foi possível obter os mesmos resultados com distribuições mais populares, como Ubuntu ou Mint.
Marcar ou não marcar a opção para Linux não influencia no resultado final, uma vez que esta opção pode ser feita posteriormente, através das opções de plataforma do projeto. Tendo em mente que nosso ambiente de desenvolvimento está baseado na plataforma Windows, seguiremos com o desenvolvimento de nosso projeto nessa plataforma (até mesmo porque essa opção é obrigatória).
Ao clicar em Next, será exibida a janela que estabelece os tipos de projeto que podemos criar a partir daqui. São quatro opções possíveis, sendo um módulo para o servidor Apache 2.4 – e este é um ponto importante: o módulo será compatível apenas com as versões 2.0, 2.2 e 2.4 do servidor Apache em servidores Windows e com a versão 2.4 em servidores Linux -, uma aplicação stand-alone para console, uma aplicação VCL stand-alone e uma aplicação ISAPI para o servidor Web IIS da Microsoft.

Essas opções podem ser discutidas futuramente, mas vamos manter o foco apenas na primeira opção. Com um módulo para o servidor Apache fica extremamente simples e rápido distribuir e implantar APIs RESTful com Delphi e DataSnap, uma vez que basta anexá-las ao servidor Apache e configurá-lo minimamente para que possa utilizá-las.
Uma das vantagens desse modelo é que todo o gerenciamento de memória é feito pelo próprio Apache. A carga do módulo, assim como sua descarga, fica por conta do container, o que diminui nossa necessidade de implementar e gerenciar mecanismos para esse controle. Além disso, caso haja necessidade de montar uma estrutura de balanceamento de carga ou clusters de disponibilidade, o servidor Apache conta com toda essa estrutura, o que facilita – e muito – a montagem dessa estrutura. E como já disse antes, vários provedores de serviço, como Amazon AWS, Microsoft Azure ou Digital Ocean, contam com servidores Apache ou há a possibilidade de montá-los facilmente.

Após escolher nossa opção, o próximo passo é nomear nosso módulo Apache. Como já temos um projeto utilizando padrões de projeto, vamos utilizá-lo como base para nossa API. Faremos uma pequena alteração nesse projeto para tornar mais simples sua operação com a API. Como esse projeto é uma calculadora, seguiremos com essa linha para esse novo projeto.
O nome do módulo é importante e será o que definirá a configuração do servidor Apache. Justamente por isso é importante que ele seja o mais claro e obedeça algumas regras simples. Por padrão, todos os módulos têm o sufixo “_module” em seu nome, então também usaremos esse sufixo. Além disso, é importante que o nome antes do sufixo represente algo que identifique facilmente a função do módulo. No nosso caso, colocamos “ds” – de DevSpace – e “calculator”, indicando que o módulo se refere a uma calculadora.
E para que o módulo seja compatível tanto com Windows quanto, futuramente, ao Linux, vamos selecionar a versão do servidor Apache como 2.4. Quando formos montar nosso ambiente de testes, isso ficará mais claro mas, de qualquer forma, a versão mais estável e segura do servidor Apache, assim como a mais utilizada e simples de implantar, é a versão 2.4, o que torna nosso projeto mais simples de ser distribuído.

Sendo assim, nosso próximo passo é selecionar o que será implementado em nosso projeto. Por padrão, o Delphi traz algumas opções já selecionadas. Uma delas é Server Methods Class, que tem as opções Sample Methods e Sample Web Files igualmente marcadas. Como nosso projeto não contempla essas opções por tratar-se de uma forma não-convencional de desenvolver uma API com DataSnap, que foge do escopo estabelecido pela Embarcadero para o desenvolvimento de aplicações multicamadas. Com isso, nenhuma das opções precisa ser marcada e, assim, eliminamos boa parte do que seria um peso morto em nosso projeto.
Entretanto, ainda há algumas que o wizard ainda criará no nosso projeto que serão desnecessárias e que, quando salvarmos o projeto em nossa estrutura, teremos um pouco mais de peso morto para remover. Nós poderíamos criar manualmente o projeto, mas o processo é um pouco mais complexo que utilizar o wizard criado pela Embarcadero e remover aquilo que não será utilizado.

Como próximo passo, devemos escolher a classe ancestral da classe de Server Methods. Dentre as três opções, TComponent, TDataModule e TDSServerModule, quando implementamos um servidor DataSnap que implemente a Server Method Class, opção que desmarcamos no passo anterior, a mais apropriada é a terceira. Mas como não utilizaremos esta estrutura, não há impacto nenhum nessa seleção, já que essa classe não será criada pelo wizard.
Então fica aqui minha dica para a Embarcadero: esse passo poderia ser removido quando a opção Server Methods Class for desmarcada, já que ela não tem mais função alguma nesse contexto.
Então, como nossa última opção, devemos escolher um diretório para salvar nosso projeto. Esse passo fica a critério de cada um, pois isso depende da estrutura de discos e diretórios que o ambiente de desenvolvimento contenha. Para minha estrutura, criei um diretório com o caminho demonstrado na imagem seguinte, a qual determina onde o projeto será salvo.

Nesse ponto não há nada que seja obrigatório, mas um mínimo de organização é recomendado. Como no meu exemplo, defini uma organização mínima para este projeto, podendo salvar os arquivos dentro de um diretório DSCalculator, dentro do diretório DataSnap – onde coloco todos os projetos desenvolvidos utilizando o DataSnap -, o qual fica dentro do diretório Delphi – onde coloco todos os projetos desenvolvidos utilizando o Delphi – e este fica dentro do diretório Projetos, onde ficam todos os projetos que podem ser desenvolvidos utilizando qualquer tecnologia.
Definindo esse caminho e finalizando o wizard, o Delphi criará os elementos desse novo projeto e, agora, começa uma nova etapa.
Removendo o peso morto
Como disse anteriormente, o wizard do Delphi cria alguns elementos desnecessários para o nosso projeto. Sempre que o executamos para criar APIs RESTful com Delphi e DataSnap, algumas estruturas que a Embarcadero julga importantes para o desenvolvimento desses projetos podem ser eliminadas. Esse alívio de peso tem por objetivo, e isso é um tanto óbvio, deixar o projeto mais leve e performático.
Mesmo desmarcando todas as opções no quarto passo, arquivos JavaScript são criados e alguns componentes são adicionados ao WebModule que servirá como nosso servidor DataSnap. Esses arquivos JavaScript, assim como os componentes desnecessários, podem ser excluídos sem medo, uma vez que eles não têm qualquer impacto sobre o que desenvolveremos daqui em diante.

Todos esses arquivos podem ser excluídos do projeto, assim como seu diretório (C:\Projetos\Delphi\Datasnap\DSCalculator\js no nosso caso). Como não teremos nenhuma página em HTML a ser provida pelo nosso projeto, assim como não precisamos de nenhuma estrutura de front end para acesso à API embutida no projeto, nada disso é necessário.

Já no WebModule, o Delphi inclui alguns componentes que se referem justamente aos arquivos que excluímos anteriormente. Dos cinco componentes que foram criados, apenas os dois presentes na imagem – TDSServer e TDSHTTPWebDispatcher – precisam ser mantidos. Por uma questão de organização do código e do projeto, decidi nomeá-los como dssDSCalculator e hwdDSCalculator respectivamente. Esses componentes serão responsáveis por receber e responder as requisições feitas à API, portanto, são o coração do nosso projeto.
Além disso, o WebModule também foi nomeado para facilitar nossa organização e, caso precisemos acessar qualquer elemento dele – o que não há necessidade nesse momento, mas pode ser uma realidade dependendo da implementação -, o processo seja mais simples. A ele demos o nome de dmDSCalculator para combinar com os demais componentes do projeto.
Salvando o projeto
Agora que já deixamos o projeto mais leve, chegou a hora de salvar o projeto em si. Eu, particularmente, gosto de manter algumas estruturas de diretórios que facilitam minha vida. Basicamente, crio um diretório chamado src para armazenar os arquivos de código fonte e um diretório chamado dpr para armazenar os arquivos de projeto (e manterei essa estrutura quando publicar o código fonte desse projeto na última parte desse artigo).

É preciso lembrar que, por padrão, o Delphi adiciona como plataforma padrão a plataforma Windows 32-bit, fazendo necessária a inclusão da plataforma Windows 64-bit, tornando-a padrão. E, com isso, precisamos definir alguns diretórios nas opções do projeto (acessadas pelo atalho Ctrl+Shift+F11) para que nosso projeto permaneça organizado. Na opção Delphi Compiler, em Target, precisamos selecionar a opção All configurations – All platforms para que essas opções se reflitam em todas as configurações de compilação do projeto. Nessa opção, configuramos a opção Output directory com o valor ..\bin\$(Platform)\$(Config), o que criará no momento da compilação, juntamente com os diretórios src e dpr, um diretório bin, onde poderemos encontrar nosso módulo compilado. Já a opção Unit output directory será configurada com o valor ..\dcu\$(Platform)\$(Config), que criará, também durante a compilação, um diretório dcu, o qual abrigará todos os arquivos .dcu gerados pela compilação. Isso ajuda a manter os diretórios organizados e o projeto mais limpo e fácil de ser gerido.

Já na opção Application, em Target, devemos selecionar a opção All configurations – Windows 64-bit platform e no campo Target file extension devemos colocar o valor so. Isso mantém a compatibilidade do nome do arquivo compilado com os demais arquivos constantes no servidor Apache, já que todos os módulo têm a extensão .so em seus nomes. É preciso lembrar que, caso você faça as compilações para as plataformas Windows 32-bit e Linux 64-bit, essa configuração deve ser feita nas demais plataformas.
Com todas as configurações efetuadas, basta salvá-las para que possamos, enfim, salvar o projeto. Para o WebModule, sugiro o nome de WebModule.Container.pas, o qual será salvo no diretório src. Já o projeto, que será salvo no diretório dpr, não precisa ter seu nome alterado, uma vez que esse nome determina o nome do arquivo compilado do módulo Apache.
Projeto salvo com sucesso. E agora?
Bem, como criar APIs RESTful com Delphi e DataSnap é algo simples, mas um tanto extenso, este artigo será dividido em partes. Nossa primeira parte fecha aqui, mas continua na parte II, onde começaremos a codificação da API em si, implementando as classes que serão consumidas e definindo aspectos do comportamento da própria API. Prometo não demorar muito pra colocar essa segunda parte no ar…
Então, até a próxima!
Faça um comentário