DataSnap no Kylix

DataSnap no Kylix, veja neste artigo de Guinther Pauli.

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!

Ebook exclusivo
Dê um upgrade no início da sua jornada. Crie sua conta grátis e baixe o e-book

Artigos relacionados