Este artigo mostra como criar um serviço da Web de plataforma cruzada com o SOAP usando o IBM DB2, Borland Delphi e Kylix.

Bob Swart, Author, Trainer, Consultant, and Webmaster, Bob Swart Training and Consultancy

Bob Swart (também conhecido como Dr.Bob - www.drbob42.com) é um autor, instrutor, consultor e Webmaster trabalhando em sua própria empresa, chamada Bob Swart Training & Consultancy (eBob42), em Helmond, Holanda. Bob, que escreve seu próprio material de treinamento em Delphi, tem sido palestrante nas Conferências Delphi and Borland Developer desde 1993. Bob escreveu centenas de artigos e é coautor do Revolutionary Guide to Delphi 2, Delphi 4 Unleashed, C++Builder 4 Unleashed, C++Builder 5 Developer's Guide, Kylix Developer's Guide, Delphi 6 Developer's Guide e do próximo C++Builder 6 Developer's Guide.



19/Dez/2002

© 2002 International Business Machines Corporation. Todos os direitos reservados.

Introdução

Em meu último artigo você foi apresentado ao mundo dos aplicativos distribuídos, em que é possível dividir o aplicativo Windows® em duas camadas: uma camada do servidor de banco de dados e um thin client. O foco estava especialmente no lado do servidor, assim como na comunicação entre o cliente (thin) e o servidor de middleware.

Desta vez, você criará um aplicativo distribuído semelhante, mas agora baseado no SOAP como o protocolo de comunicação, em que o servidor (usando o DB2®) se transformará em um serviço da Web de plataforma cruzada. Como consequência, é possível compilar o servidor e o cliente com o Delphi® 7 e KylixTM 3 e implementá-los no Windows ou no Linux. Essa é realmente uma solução de plataforma cruzada.


Criando o aplicativo de servidor Windows SOAP

Comece criando o servidor no Windows e então crie o cliente no Linux. (É possível fazer isso de uma outra maneira caso você deseje, ou criar ambos no Windows ou no Linux).

  1. Para o servidor Windows SOAP, inicie o Delphi 7 Enterprise, clique em File > New > Other e vá até a guia Web Services do Object Repository (consulte a Figura 1).
    Figura 1. Object Repository do Delphi 7
    Object Repository do Delphi 7
  2. Para criar um aplicativo DataSnapTM como um serviço da Web de plataforma cruzada, clique duas vezes no ícone do SOAP Server Application, que inicia o assistente correspondente (consulte a Figura 2).
    Figura 2. Criando um novo SOAP Server Application
    Criando um novo SOAP Server Application
  3. Usando o Delphi 7 (no Windows), é possível selecionar entre um executável ISAPI/NSAPI DLL, Apache 1.x ou 2.x DLL, CGI ou um executável Web App Debugger. É possível utilizar o último citado para depurar o aplicativo a partir do Delphi IDE (mas não é possível implementá-lo, é necessário transformá-lo em um dos outros destinos para poder implementar o aplicativo do servidor da Web). Usando o Kylix 3 (no Linux), é possível selecionar um arquivo Apache Dynamic Shared Object (DSO), um executável CGI ou um executável Web App Debugger. Para este exemplo, selecione um executável CGI, mas para a utilização em um ambiente real talvez você deseje selecionar um mais eficiente, como o Apache ou ISAPI/NSAPI DLL. Após fazer sua opção, clique em OK.
  4. Um novo SOAP Server Application e SOAP Web Module são criados por você. Mas antes que você possa observar mais detalhadamente, é exibida uma caixa de diálogo pop-up perguntando se você deseja criar uma interface para o módulo SOAP agora (consulte a Figura 3).
    Figura 3. Devido ao fato de você estar criando um servidor DataSnap SOAP especial, clique em No
    Devido ao fato de você estar criando um servidor DataSnap SOAP especial, clique em No

    Clique em No, pois você não está interessado em criar um aplicativo de serviço da Web regular no momento. Ao contrário, você deseja criar um Servidor DataSnap SOAP especial.

    Como você pode observar na Figura 4, o módulo SOAP Web já contém três componentes:

    • Componentes THTTPSoapDispatcher
    • THTTPSoapPascalInvoker
    • TWSDLHTMLPublish

    Consulte a ajuda on-line para obter mais detalhes sobre estes componentes. Basicamente eles realizam todo o "gerenciamento" do SOAP e WSDL para seu Servidor DataSnap SOAP, para que você possa se concentrar nas tabelas do banco de dados e não precise se preocupar com o restante.

    Figura 4. Módulo SOAP Web com componentes
    Módulo SOAP Web com componentes
  5. Salve o módulo SOAP Web no arquivo SWebMod.pas e todo o projeto no D7DB2CGI.dpr (que resultará no D7DB2CGI.exe).
  6. Agora, adicione um SOAP Data Module para se conectar ao banco de dados DB2 (usando o segundo item na guia WebServices do Object Repository. Consulte a Figura 1 novamente). No SOAP Data Module Wizard, é necessário apenas especificar o nome de seu novo módulo de dados, nomeie-o como D7DB2SAMPLE para indicar que você ainda está usando o banco de dados DB2 SAMPLE como da última vez (consulte Figura 5).
    Figura 5. Novo SOAP data module wizard
    .
  7. Salve o SOAP Data Module no SDataMod.pas. Devido ao fato de você desejar imitar o aplicativo criado anteriormente, desta vez como um servidor DataSnap, é necessário utilizar novamente os componentes de acesso aos dados do dbExpressTM e um TDataSetProvider aqui, e continuar no cliente DataSnap SOAP com um componente TSOAPConnection e TClientDataSet.
  8. Usando o dbExpress novamente, primeiramente coloque um componente TSQLConnection no SOAP Data Module. Configure sua propriedade ConnectionName como DB2Connection, verifique os parâmetros de conexão (verifique se User_Name e Password possuem valores) e, finalmente, defina a propriedade do LoginPrompt como False. Caso possa então definir a propriedade Active como True sem problemas, você sabe que pode estabelecer uma conexão com o banco de dados DB2 SAMPLE.
  9. Agora, coloque um componente TSQLDataSet (para EMPLOYEE) e três componentes TSQLTable, um para cada uma das tabelas de detalhes do DB2 que deseja utilizar novamente neste aplicativo com diversas camadas (EMP_ACT, EMP_PHOTO, e EMP_RESUME).
  10. Ative o componente TSQLDataSet SQLdsEMP, direcione sua Conexão para a SQLConnection1 e defina sua propriedade CommandType como ctTable e sua propriedade CommandText como EMPLOYEE. Coloque um componente TDataSetProvider da guia Data Access, ative o dspEMPLOYEE e direcione sua propriedade DataSet para SQLdsEMP.
  11. Para cada uma das tabelas EMP_ACT, EMP_PHOTO e EMP_RESUME, defina a propriedade SQLConnection da mesma maneira que TableName (para a tabela correspondente).
  12. Agora, para criar os relacionamentos de detalhe principal, é necessário um componente TDataSource (chamado de dsEMP) direcionado para o SQLsdEMP. E agora todos os três componentes do TSQLTable devem direcionar suas propriedades MasterSource para o componente DataSource. Além disso, clique na propriedade MasterFields das três SQLTables de detalhes e especifique os campos EMPNO para definir novamente os relacionamentos de detalhes principal. O SOAP Data Module deve se parecer com isso agora (consulte a Figura 6):
    Figure 6. SOAP data module com componentes do dbExpress
    Figure 6. SOAP data module com componentes do dbExpress

Implementando o aplicativo de servidor

Salve e compile o projeto. Isso cria o D7DB2CGI.exe, que você pode implementar em seus scripts do servidor da Web ou o diretório cgi-bin. Obviamente, após o aplicativo ser colocado nesse diretório, ele ainda precisa poder acessar o banco de dados DB2 SAMPLE (no meu caso, a máquina de desenvolvimento também é a máquina de implementação, mas em ambientes reais, talvez seja necessário alterar seus parâmetros SQLConnection de conexão para conseguir se conectar ao banco de dados DB2 SAMPLE).

Após o aplicativo ser implementado corretamente, ative o executável do serviço da Web a partir do navegador da Web. Ele exibe as informações sobre os serviços disponíveis no servidor SOAP (consulte a Figura 7 para obter a listagem completa).

Figura 7. Informações do Serviço para o serviço da Web D7DB2CGI
Informações do Serviço para o serviço da Web D7DB2CGI

Observe que não há menos do que quatro serviços (ou interfaces) implementados por seu serviço da Web. Os três primeiros apontam para o mesmo "serviço", isto é o módulo DataSnap SOAP, que se expõe para o mundo externo usando as interfaces IAppServer, IAppServerSOAP e ID7DB2SAMPLE.

Se você adicionar /WSDL à URL, é possível obter a própria Listagem WebService (consulte a Figura 8). O WSDL (Web Services Description Language) é uma maneira formal para permitir que o servidor SOAP exponha seus recursos para os clientes SOAP que desejam utilizá-lo.

Figura 8. Listagem do WebService para D7DB2CGI
Listagem do WebService para D7DB2CGI

Para seu servidor SOAP, é possível obter a especificação WSDL formal caso adicione o nome da interface após o /WSDL na URL. Então, para a interface IAppServer. a url para obter o WSDL é http://localhost/cgi-bin/D7DB2CGI.exe/wsdl/IAppServer.


Criando o cliente SOAP no Linux

Uma vez que você tiver o WSDL (ou a URL para gerar o WSDL), é possível escrever um cliente SOAP para acessar o servidor SOAP. Neste caso, você deseja gravar o cliente usando o Kylix 3 e implementá-lo no Linux. Obviamente, não será possível utilizar a URL com o host local nele no Linux, pois ela apontaria para a mesma máquina. Desta vez, você precisa utilizar o endereço IP ou nome DNS real da máquina servidor que faz o host do servidor SOAP. No meu caso, o endereço IP é 192.168.92.201 (dentro de minha intranet local).

Para criar o cliente SOAP no Linux:

  1. Inicie o Kylix 3 Enterprise e crie um novo aplicativo.
  2. Para estabelecer a conexão com o servidor SOAP, utilize um componente TSOAPConnection da guia Web Services do Kylix. Defina a propriedade da URL para a utilizada anteriormente, mas agora especifique soap ao invés de wsdl (se utilizar /wsdl, você irá obter a Web Services Description Language, se utilizar /soap, enviará uma solicitação para o servidor). Então, para da propriedade da URL no meu caso é http://192.168.92.201/cgi-bin/D7DB2CGI.exe/soap/IAppServer.
  3. A seguir, coloque quatro componentes TClientDataSet e nomeie-os como cdsEMP, cdsEMP_ACT, cdsEMP_PHOTO, e cdsEMP_RESUME, seguidos por quatro componentes TDataSource chamados de dsEMP, dsEMP_ACT, dsEMP_PHOTO, and dsEMP_RESUME, em que cada componente TDataSource esteja conectado ao componente TClientDataSet correspondente.
  4. Agora, clique duas vezes no componente cdsEMP para iniciar o Fields Editor. Clique com o botão direito do mouse no Fields Editor e selecione Add All Fields. Como resultado, você não apenas vê todos os campos da tabela Employee, mas também três campos especiais chamadas SQLtblEMP_RESUME, SQLtblEMP_PHOTO e SQLtblEMP_ACT. Estes três campos são do tipo TDataSetField e, na realidade, são "conjuntos de dados aninhados", pois contêm registros de detalhes (para RESUME, PHOTO e ACT) que pertencem ao registro mestre do employee atual. Eles estão dentro do mesmo registro, agrupados em uma entidade, fazendo com que sejam adequados para receber e para serem utilizados para aplicar atualizações (que serão feitas novamente em alguns momentos).
  5. Após ter adicionado os campos frequentes (no Fields Editor), defina as propriedades do DataSetFields para garantir que os três TClientDataSets de detalhe estejam conectados através do conjunto de dados cdsEMP principal:
    • Defina a propriedade DataSetField do cdsEMP_ACT como cdsEMPSQLtblEMP_ACT
    • Defina a propriedade do DataSetField do cdsEMP_PHOTO como cdsEMPSQLtblEMP_PHOTO
    • Defina o DataSetField do cdsEMP_RESUME como cdsEMPSQLtblEMP_RESUME

    Agora você precisa de dois TDBGrids, um TDBNavigator, um TDBMemo e um TDBImage para criar a visualização do momento do design da Figura 9.

Figura 9. Forma do CLX do Kylix 3 CLX e cliente SOAP no momento do design
Forma do CLX do Kylix 3 CLX e cliente SOAP no momento do design

Observe que eu também coloquei um botão que pode enviar todas as atualizações (inserções, edições e exclusões) em uma única ativação para o ApplyUpdates, com esta única linha de código no manipulador de eventos OnClick:

    procedure TForm3.btnApplyUpdatesClick(Sender: TObject);
    begin cdsEMP.ApplyUpdates(0) end;

Além da ativação única para o ApplyUpdates, você deve escrever também algum código para os manipuladores de eventos OnCreate e OnDestroy do formulário do cliente SOAP DataSnap, para explicitamente abrir o componente cdsEMP TClientDataSet (quando o aplicativo for iniciado), e verificar se foram feitas quaisquer alterações para ter certeza de que o ApplyUpdates será ativado (quando o aplicativo for novamente desativado). Da mesma maneira que antes, o código é:

    procedure TForm3.FormCreate(Sender: TObject);
    begin cdsEMP.Active := True end;

	procedure TForm3.FormDestroy(Sender: TObject); begin if
    cdsEMP.ChangeCount > 0 then cdsEMP.ApplyUpdates(0)
    // force any pending updates! end;

Após este código, você pode compilar e executar o cliente SOAP do Kylix no Linux (consulte a Figura 10).

Figure 10. Forma do CLX do Kylix 3 e do Cliente SOAP no momento da execução
Figure 10. Forma do CLX do Kylix 3 e do Cliente SOAP no momento da execução

Implementando o servidor DataSnap

Para implementar o servidor DataSnap você precisará de uma máquina a partir da qual seja possível acessar o banco de dados DB2 SAMPLE, claro, da mesma maneira que o driver dbExpress DB2 e o MIDAS.dll. Para o cliente DataSnap, o trabalho é menor: É necessário apenas o executável do cliente e o arquivo lib.midas.so no Linux ou MIDAS.dll no Windows (e caso compile seu projeto com a unidade MidasLib no Windows, você não precisará nem implementar o MIDAS.dll).


Conclusão

As técnicas neste artigo resultam em uma técnica de plataforma cruzada que podemos utilizar com o Kylix (Delphi e C++ edition) no Linux assim como o Delphi e C++Builder no Windows, em que tanto o servidor ou o cliente DataSnap (ou ambos) possam ser executados no Linux ao invés de no Windows. É possível ainda combinar os clientes, tendo um sendo executado no Windows e outro no Linux, com servidor DataSnap que são executados no Windows e no Linux (é necessária apenas uma simples recompilação para migrá-los). Isso realmente expande seu banco de dados DB2 para thin-clients que podem ser executados de praticamente qualquer lugar!


Download

DescriçãoNomeTamanho
Código de amostracode.zip  ( HTTP | FTP )11 KB

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Information Management
ArticleID=406187
ArticleTitle=DB2 e Delphi 7 -- SOAP e Database Web Services
publish-date=12192002