sábado, 3 de fevereiro de 2007

Construindo um WebService - Delphi

Esse exemplo foi desenvolvido em Delphi 7

Iniciando a implementação do nosso WebService, voltaremos na barra de menu do principal do Delphi: File New Other WebService SOAP Server Application.

Em segida prossiga com o passo-a-apsso Abaixo:


Click no ícone SOAP Server Application. Na próxima caixa de diálogo você terá de escolher que tipo de tecnologia de script do lado servidor seu Webservice irá utilizar. Para este exemplo marque a opção “CGI Satand-alone executable”.


Em seguida o Delphi irá perguntar se desejamos que ele crie uma interface para a aplicação. Clicke em “Yes”. Sim, queremos criar a interface. Se você deseja que seu serviço seja utilizado por outro sistema, será necessário para isso criar uma interface desse serviço. No protocolo de Webservice esse interface estará definida dentro de um padrão chamado WSDL. A grande vantagem de vc desenvolver webservices em Delphi é que ele te abstrai de todos esses detalhes. Por isso, poderemos prossegui nosso exmplo sem a obrigatoriedade de lermos um catatal de especicifações de protocolos. HAUHAUHHA ..... graças a Deus. Foi mal, mas .... isso é muito bom.

Em “service name” digite “Servicos”, fazendo isto estamos criando uma interface para o nosso serviço com o nome de “servicos”.



Para a seleção de Service activation model definiremos Per Request, escolhendo essa opção estaremos definido como as requisições ao nosso serviço serão atendidas. Você pode desmarcar a checkedbox (generate comments) como o nome já diz, desta forma o Delphi, quando acabarmos de definir todos os parâmetros dessa aplicação, não gerará comentários sobre as Units criadas. Veja o exemplo abaixo, para um melhor acompanhamento siga estritamente a nomenclatura aqui utilizada.





Note que foram criadas Quatro unidades: Projetc1, ServicosImpl, ServicosIntf, Unit1. No teclado aperte Ctrl+F12 (View Unit), e compare com a figura ao lado.

ServicosImpl: unidade de implementação, correspondente ao arquivo ServicosImpl.pas

ServicosIntf: Unidade onde estarão as declarações referentes à interface. Correspondente ao arquivo ServicosIntf.pás.

Já é hora de salvar o que foi feito até agora pressione "CTRL + Shift + S".

Junto com o WebModule criado é automaticamente adicionado os componentes fundamentais para a implementação do servidor. Para visualizar o WebModulo, no teclado aperte Ctrl+F12 (View Unit), e selecione Unit1.

HTTPSoapDispatcher: Recebe e envia mensagens (Web) para o objeto especificado em sua propriedade

“Dispatcher”, para que sejam decodificadas. Registra-se automaticamente junto ao

WebModule, fazendo com que não seja necessário a criação de actions que direcionam

as requisições para o HTTPSoapDispatcher. Desta forma ele pode receber todas as

requisições automaticamente.

HTTPSoapPascalInvoker: Recebe as mensagens enviadas pelo HTTPSoapDispatcher e a interpreta, fazendo com

que sejam executados os métodos correspondentes à solicitação. E também faz o

caminho contrário codificando o retorno do método para o padrão SOAP.

WSDLHTMLPublish: Publica todas as informações registradas pelo Web Service, usando WSDL.


Criando o primeiro serviço

Nosso primeiro exemplo consiste em criar um serviço que informe a data e a hora local do servidor. Para isso implementaremos uma função que retorne esta a data, dia da semana e hora.

Em ServicosIntf , vamos declarar o cabeçalho da função “DataHoraDiaLOcal”. seguida codificaremos o corpo desta função em ServicosImpl. Veja no exemplo abaixo, declaramos a função na sessão “Type”, logo abaixo do GUID:




Aqui declaramos somente a assinatura, note que o nome dessa Unit sugere uma área de delaração como a seção Interface numa unit .pas comun, ServicosIntf. Logo, para codificarmos o corpo desta função termos de fazê-lo na unit correspondente a seção de implementation, podemos fazer um “Ctrl+C” do cabeçalho(function DataHoraDiaLOcal: string: stdcall;) e colarmos em ServicosImpl.

Feito o “Ctrl+V” na sessão Public de ServicosImpl. Com o cursor ainda na mesma linha, pressione “Ctrl+Shift+C” para que o Delphi escreva o corpo da função, observe o exemplo abaixo:

function TServicos.DataHoraDiaLocal: String;
begin

Result := FormatDateTime( 'dd mmmm, dddd, yyyy. HH:nn:ss ' , Now)

end;

Pronto, no que diz respeito a codificação nosso primeiro exemplo termina aqui, basta que Compilemos a aplicação (no Menu: Project Compile Project, ou pelo atalho "Ctrl + F9") , sempre lembrado de salvar o exemplo com SaveAll (Ctrl+Shift+S). Contudo, antes de executar a aplicação é preciso fazer o deploy dessa aplicação. Utilizaremos o IIS para isso. Portanto, crie uma pasta virtual no IIS apontado para o diretório onde está o executável compilado pelo exemplo que estamos criando. Defina como documento principal o .exe. Pronto, acabou!!

Com a aplicação devidamente compilada, salva e feito o deploy. Podemos testá-la no browser, digitando na barra de endereços:

http://LocalHost/ nome_da_pasta_virtual


Repare que a nossa função está publicada. Clicke no browser em Iservicos [WSDL] para visualizar a implementação. É preciso salvarmos este arquivo XML para que possamos importar esta interface para a aplicação cliente que construiremos num outro post.

Veja o próximo no exemplo a página onde Delphi gerou todo o código XML correspondente a nossa implementação. Podemos também gerar um arquivo XML com a definição do nosso serviço.

No próximo post exemplificaremos um aplicativo cliente para consumir esse serviço que acabamos de criar.

Mais artigos no Estação Zn sobre Ws


Preciso saber mais sobre Webservices ...

7 comentários:

  1. Eu desenvolvi conforme o artigo porem ao abrir no browser ao invés de executar o webservice ele chama o aplicativo para download.

    Pq isso ocorre?

    Uso Apache+PHP5+Mysql

    ResponderExcluir
  2. Fernando, acho que vc já deve ler esse tópico mas vou deixar a resposta.

    O serviço criado está em formato .exe (o cgi que é o próprio serviço).

    Você deve configurar o apache pra executar chamadas no arquivos .exe, caso contrário ele vai disponibilizar o arquivo pra download.

    Uma dica é renomear o .exe pra .cgi e configurar o apache pra rodar .cgi, dessa forma não atrapalha os downloads de arquivos .exe do seu servidor.


    abraços.

    ResponderExcluir
  3. Qual a diferença entre os tipos de aplicações?

    ISAPI/NSAPI, CGI E Web App Debugger?

    Quais as vantagens e desvantagens de cada um?

    ResponderExcluir
  4. Prezado GAmbit,
    esse tipo de comparação, pessoalmente, eu não consigo fazer de forma superficial. Preciso de tempo e paciência pra escrever sobre isso.
    Pensei várias vezes em escrever sobre esse tema (alias, nem tenho certeza se nãofiz ... do jeito que eu gostaria certamente... se vc googlar mais um pouco vc vai achar. Mas vou tentar apontar o que acho mais relevante sobre cada uma dessas tecnologias, tentando sair do que é comumente publicado por ai.
    ISAPI – API do IIS, é uma tecnologia da MS que é baseada na solução
    proprietária dela em “.dll” (lazy bind) cujo a performance é mto otimizada,

    principalmente por ser nativa da plataforma Windows. Principais vantagem, do
    meu ponto de vista, são: A capacidade de guardar estado e performance.

    Inconveniências: Tranca de fornecedor, vc fica preso a plataforma Windows, e
    desconhecimento da tecnologia pelo pessoal de infra e suporte (As vezes acho
    que eles tem medo de dll, ou acham que isso é uma coisa misteriosa,
    mística).
    NSAPI: A mesma coisa que o ISAPI só que de propriedade da Netscape (se não me

    engano), nunca trabalhei com essa tecnologia. Portanto, passo essa....

    CGI: Foi um dos primeiros protocolos que permitiu que o I/O de um programa
    pudesse fazer interface com o http. Nos primórdios da web era muito comum
    programar em Perl gerando um CGI para desenvolvimento de serviços web. Isso
    até criou uma tribo de programadores Perl.

    Web App Debugger: Trata-se de uma solução da própria IDE, no caso do
    Intraweb o próprio framework possui um software que simula um servidor web
    (Como se fosse um JBoss, ou ISS, ou Apache) para ambiente de
    desenvolvimento. No Delphi outras tecnologias para Web, como WebBroker e

    WebSnap, possuem também uma opção de Web App Debugger.

    O Importante é ter em mente que qualquer uma linguagem de programação para
    web precisa de uma camada lógica que traduza o I/O do seu programa para o
    universo web (Que é um conjutos de protolocos sobre o http), falando de
    forma simplória. Muitos produtores de tecnologia desenvolveram sua solução
    própria. No caso da MS ela acoplou isso, totalmente, ao SO. Portanto,
    podemos concluir que os demais produtos (Como JBoss, Tom Cat, Websphere,
    Glassfish etc..) sofrem influencia na sua essência (digamos assim) das

    características do seu produtor. Do criador do produto, servidor web.
    Para vc ter mais respostas sobre o que vc está me perguntado aconselho
    pesquisar sobre a importância e a razão pela qual precisamos de softwares
    servidores web. Cada uma das tecnologias que vc me perguntou são, no
    contexto da sua pergunta, a implementação do Delphi para se desenvolver
    programas compatíveis com os servidores web existentes no mercado.
    Espero ter ajudado!

    O Felipe acrescentou isso:

    CGI é um programa que recebe chamadas http e responde com HTML. Em CGI você cria uma instância do programa para cada usuário conectado, mas a manutenção é mais fácil, porque não precisamos parar o servidor, já que não tem estado.

    NSAPI e ISAPI são APIs que representam simplesmente interfaces para desenvolvermos software para a web usando as plataformas Netscape e Microsoft, respectivamente

    Só para reforçar: O NSAPI é o mesmo princípio do ISAPI só que usa o Servidor Web da Netscape. Na verdade o correto é dizer que o ISAPI é a implementação Microsoft do NSAPI, porque o NSAPI veio primeiro (como quase sempre na história da MS).

    A principal vantagem do ISAPI é que várias conexões de clientes não criam vários processos rodando ao mesmo tempo, porém para atualizar é preciso descarregar a aplicação parando o servidor.


    Obrigado por acessar o Estação Zn.

    ResponderExcluir
  5. Pessoal, muito obrigado pela atenção e pela resposta muito bem detalhada. Pode deixar vou dar uma procurada pela web para me aprofundar mais no assunto. Mas vocês ja me clarearam bastante a idéia. Obrigado mesmo.

    ps.: ja implementei o servidor de webservice e o cliente também seguindo as suas explicações e tudo funcionou perfeitamente. Parabéns pelo site.

    ResponderExcluir
  6. A Equipe do Estação ZN é que te agradece, Gambit!
    Enquanto estive tentando te responder, conversei com o Daniel, com o Felipe e com o Bruno. Pretendemos falar mais sobre esse tema aqui no ZN.
    Vlw, esse tipo de troca é mto importante pro nosso trabalho aqui no blog.
    Obrigado e volte sempre ...
    O Estação ZN Agradece!!

    ResponderExcluir
  7. Pessoal, Graças a esse post, consegui montar um webservices em Delphi que já está funcionando muito bem.

    Estou com uma duvida que não consigo solucionar na internet. Meu webservice está disponbilizado para varias pessoas fazerem acesso. Eu gostaria de gravar um log com data, hora e o IP (ou alguma outra informação) de quem acessou o WS, porém não encontro em lugar nenhum como detectar o IP de quem está consultando.

    Existe alguma maneira de se fazer isso no webservice? Infelizmente na rede existem poucas informações sobre webservice em Delphi.

    Obrigado

    ResponderExcluir

 
BlogBlogs.Com.Br