DataSnap no Kylix
Criando aplicações multicamadas no Linux
Na edição 46 da revista ClubeDelphi vimos como criar uma aplicação multicamadas passo a passo, usando Delphi 7, DataSnap, dbExpress e IB/FB. Nossa aplicação final poderia ser compilada tanto para ambiente cliente/servidor, Midas/DataSnap ou ainda Desktop. Vimos ainda algumas técnicas para desenvolvimento MultiTier. A aplicação podia usar ainda tanto o protocolo SOAP quanto o protocolo COM+. Você pode fazer download do aplicativo criado a partir do endereço:
http://codecentral.borland.com/codecentral/ccweb.exe/author?authorid=222668
Recebi vários e-mails de leitores comentando o artigo, vários pediram para que mostrássemos como construir uma aplicação multicamadas usando somente Kylix / Linux. Este é o tema deste artigo.
Introdução à programação DataSnap no Kylix
O exemplo deste artigo foi construído usando-se Kylix 3 Enterprise. A distribuição do Linux que utilizei foi a Red Hat 7.2, a versão do MySQL foi a 3.23 e o Apache 1.3. Utilizei essas configurações não por uma escolha pessoal: é uma das combinações mais estáveis para se trabalhar com esse tipo de aplicação e recomendada pelo Borland.
Como no Linux não temos o COM, nosso servidor de aplicação usará o protocolo SOAP, através da criação de Web Services no Kylix (suportada a partir do Kylix 2 Enterprise). O servidor SOAP será publicado em um servidor Apache.
Não é necessário criar métodos de Web Services para se trabalhar com DataSnap no Kylix, seja para transferir dados ou aplicar atualizações. A Borland criou uma interface chamada IAppServerSOAP, que é utilizada internamente pelo ClientDataSet, DataSetProvider e SOAP Data Module. Veja a definição da interface a partir da unit SOAPMidas.pas.
IAppServerSOAP = interface(IInvokable)
['{C99F4735-D6D2-495C-8CA2-E53E5A439E61}']
function SAS_ApplyUpdates(const ProviderName:
WideString; Delta: OleVariant; MaxErrors: Integer;
out ErrorCount: Integer; var OwnerData: OleVariant):
OleVariant; stdcall;
function SAS_GetRecords(const ProviderName: WideString;
Count: Integer; out RecsOut: Integer;
Options: Integer; const CommandText: WideString;
var Params: OleVariant; var OwnerData: OleVariant):
OleVariant; stdcall;
function SAS_DataRequest(const ProviderName: WideString;
Data: OleVariant): OleVariant; stdcall;
function SAS_GetProviderNames: TWideStringDynArray; stdcall;
function SAS_GetParams(const ProviderName: WideString;
var OwnerData: OleVariant): OleVariant; stdcall;
function SAS_RowRequest(const ProviderName: WideString;
Row: OleVariant; RequestType: Integer;
var OwnerData: OleVariant): OleVariant; stdcall;
procedure SAS_Execute(const ProviderName: WideString;
const CommandText: WideString;
var Params: OleVariant; var OwnerData: OleVariant); stdcall;
end;
Essa interface permite a comunicação e troca de DataPackets entre um servidor SOAP e uma aplicação cliente. Os dados ao invés de usarem o formato COM usando o formato XML, permitindo a troca de dados através do protocolo HTTP / 80.
A partir de agora construiremos uma aplicação passo a passo. Criaremos o banco de dados, faremos ao acesso a dados, criaremos a aplicação servidora e finalmente a aplicação cliente.
Criando o banco de dados no MySQL
Abra um Shell do Linux e inicie o servidor MySQL usando o seguinte comando:
./etc/init.d/mysqld start
Depois, abra o MySQL Monitor digitando “mysql”. Crie um banco de dados e uma tabela simples, usando os seguintes comandos (digite um por linha):
mysql> create database CLUBEDELPHI;
mysql> use CLUBEDELPHI;
mysql> create table ALUNOS (ID_ALUNO integer not null primary key,
NOME_ALUNO varchar(40), FOTO blob);
Insira alguns registros usando o seguinte comando:
mysql> insert into ALUNOS values (1,’GUINTHER’,null);
Para ver os registros incluídos, basta dar um select (Figura 1):
Figura 1. Trabalhando com MySQL através de linha de comando
Dica: consulte a edição 28 da Revista ClubeDelphi, onde o acesso ao MySQL a partir do Delphi e Kylix foi discutido em detalhes.
Criando o Servidor SOAP
No Kylix, clique em File|New>Other>WebServices>SOAP Server Application (Figura 2).
Figura 2. Criando um servidor SOAP
Escolha a opção CGI Stand-Alone executable (Figura 3).
Figura 3. Tipos de servidores suportados
Quando o Kylix perguntar se você deseja criar uma interface para o módulo SOAP, responda não. Seu WebModule deve estar semelhante ao da Figura 4.
Figura 4. Web Module do servidor SOAP
Criando o SOAP DataModule
Clique em File|New>Other>WebServices>SOAP Server Data Module (Figura 5).
Figura 5. Criando um SOAP DataModule
Um SOAP Data Module é semelhante a um Data Module (na verdade ele é um descendente). Ele implementa a interface IAppServerSOAP discutida anteriormente. Digite DM para o nome do SOAP Data Module (Figura 6).
Figura 6. Dando um nome para o SOAP Data Module
Clique em File|Save All e salve todos os arquivos em um diretório chamado “Servidor”.
Configurando a conexão dbExpress
Coloque no SOAP Data Module os componentes SQLConnection e SQLQuery da paleta dbExpress, e um DataSetProvider da paleta Data Access. Veja a Figura 7.
Figura 7. Acesso ao MySQL com dbExpress
Relacione os componentes configurando suas propriedades, baseando-se no diagrama da Figura 8.
Figura 8. Configurando a relação entre os componentes.
Dê um duplo clique no SQLConnection e no editor de conexões do dbExpress clique em “+”. Escolha MySQL no Driver Name e digite “CLUBEDELPHI” para Connection Name (Figura 9).
Figura 9. Criando uma conexão MySQL
Clique em OK e configure as propriedades da conexão conforme a Figura 10. HostName recebe o nome ou IP do servidor que está rodando o banco MySQL, Database é nome do banco de dados (e não o caminho físico como no IB), User_Name e Password definem as credenciais de acesso. Nesse exemplo estamos usando as credenciais padrão.
Figura 10. Parâmetros da conexão dbExpress
Altere a propriedade SQL do SQLQuery para
select * from ALUNOS
Nota: Observe que nosso select é bastante simples. No entanto, em situações reais, é altamente recomendado o uso de parâmetros para otimizar o tráfego de dados na rede, como fizemos no exemplo da edição 46.
Distribuindo o servidor SOAP
Clique em Project|Options e na opção Output directory digite o diretório padrão de scripts do Apache, nesse caso /var/www/cgi-bin (Figura 11). Para quem trabalha com IIS, esse diretório pode ser comparado ao c:\Inetpub\Scripts.
Figura 11. Compilando a aplicação no diretório do Apache
Compile a aplicação. Esse procedimento fará com que o arquivo binário (nesse caso Project1) seja compilado já dentro do diretório publicado do Apache, sem a necessidade de se fazer uma cópia depois da compilação. Agora abra um Shell do Linux e digite os seguintes comandos:
ln -s /usr/local/kylix3/bin/libxercesxmldom.so.1
/usr/lib/libxercesxmldom.so.1
ln -s /usr/local/kylix3/bin/libxerces-c1_6_0.so
/usr/lib/libxerces-c1_6_0.so
ln -s /usr/local/kylix3/bin/libicuuc.so.20
/user/lib/libicuuc.so.20
ln -s /usr/local/kylix3/bin/libicudt20l.so
/user/lib/libicudt20l.so
ln -s /usr/local/kylix3/bin/libmidas.so.1
/user/lib/libmidas.so.1
ln -s /usr/local/kylix3/bin/libsqlmy.so
/user/lib/libsqlmy.so
ln -s /usr/lib/mysql/libmysqlclient.so
/usr/lib/libmysqlclient.so
Isso criará links em /usr/lib para as bibliotecas utilizadas pela aplicação Kylix, como arquivos do Midas, dbExpress e MySQL.
Testando o Servidor SOAP
Certifique-se que o servidor Apache esteja rodando. Você poderá iniciar o servidor usando o seguinte comando:
./etc/init.d/httpd start
Recomendo que você abra um navegador e acesso http://localhost. Se aparecer a página padrão do servidor Apache é porque ele está rodando corretamente. Abra um navegador e digite a seguinte URL:
http://localhost/cgi-bin/Project1
Deverá aparecer a página semelhante a mostrada na Figura 12. Essa página descreve as interfaces publicadas pelo servidor SOAP, bem como os documentos WSDL. Essa página é automaticamente criada pelo componente WSDLHTMLPublish, que está no Web Module da aplicação.
Figura 12. Informações sobre o servidor SOAP
Criando a aplicação Cliente
Clique em File|New|Application. Coloque no formulário um SoapConnectioin (paleta WebServices), um ClientDataSet e um DataSource (paleta DataAcess). Relacione as propriedades dos componentes conforme o diagrama da Figura 13.
Figura 13. Componentes da aplicação cliente
Configure as propriedades do SoapConnection conforme a Tabela 1:
Propriedade |
Valor |
URL |
http://127.0.0.1/cgi-bin/Project1/soap/IDM |
UseSoapAdapter |
False |
Connected |
True |
Tabela 1.
Aponte a propriedade ProviderName do ClientDataSet para DataSetProvider1 e Active para True. Coloque no formulário os seguintes componentes: duas Labels, dois Buttons, dois DBEdits, um DBImage um DBNavigator (paleta Data Controls) e um OpenDialog. Organize os componentes no formulário conforme mostrado na Figura 14.
Figura 14. Formulário principal da aplicação
Aponte a propriedade DataSource dos DBEdits, do DBImage e do DBNavigator. Aponte a propriedade DataField dos DBEdits e do DBImage para ID_ALUNOS, NOME_ALUNO e FOTO, respectivamente. No evento OnClick do botão Apply digite:
ClientDataSet1.ApplyUpdates(0);
Isso aplica no BD as alterações feitas no ClientDataSet. E no evento OnClick do botão Load digite:
if OpenDialog1.Execute then
ClientDataSet1FOTO.LoadFromFile(OpenDialog1.FileName);
Isso abra uma caixa de diálogo para carregar uma imagem para o campo FOTO. Veja a aplicação final em excução na Figura 15.
Figura 15. Testando o acesso ao servidor SOAP a partir de uma aplicação cliente
Conclusões
Você poderá agora acessar seu servidor de aplicação SOAP no Linux a partir de qualquer lugar da Web, sem se preocupar com firewalls, usando o protocolo HTTP. Como usamos o formato XML, você pode construir aplicações clientes em diversas outras linguagens, como Delphi, C++ etc. Graças a Borland e a tecnologia DataSnap / IAppServer, vimos que desenvolver aplicação MultiCamadas é tão simples quando desenvolver uma aplicação cliente/server, usando dbExpress e ClientDataSet. Um abraço a todos e até a próxima!