When the solution matters*

4D Internacional


| Clientes | Histórias de êxito | Buscador de soluções | Perfis |

Companhia Geral de Essências

Serviços Web em prática
Por Tito Ciuro

 

No meu artigo anterior eu expunha por que os Serviços Web abrem um mundo de oportunidades. Não se trata de um detalhe exaustivo, senão, de uma breve introdução que pretendia apresentar o conceito dos Serviços Web e dar uma série de idéias desde um ponto de vista prático. Neste segundo artigo quero ir muito mais além e explicar uma série de técnicas para poder publicar e subscrever-se aos Serviços Web utilizando 4D.

 

Pré-requisitos

Mesmo que possa programar com 4D Server e 4D Client, este artigo se baseia em 4D (versão monousuário), utilizando a versão 2003.6 em Mac OS X (Panther e Tiger, 10.3.9 e 10.4.1 respectivamente).

 

Problema inicial: como poder concordar a uma série de dados localizados em um banco de dados externo.

              

Vendas (servidor) contêm o banco de dados com os clientes, pedidos, faturas, comerciais, etc. O Diretor de Vendas (cliente) deseja visualizar os comerciais dados de alta no servidor. Esta consulta poderia se realizar com 4D, 4D Server ou 4D Client. Para que a consulta possa levar-se a cabo, o servidor deverá publicar os serviços que oferece. No entanto, como pode informar-se (descobrir) que serviços oferecem um servidor? Sem ter acesso ao programador ou ao código fonte, seria muito difícil, por não dizer impossível, levar a cabo esta tarefa.

A solução vem da mão do WSDL, um documento que o servidor publica e que o cliente pode analisar para informar-se quê serviços estão presentes. Mediante a Web Services Wizard do 4D, implementar um método que se subscreva ao servidor é realmente fácil.

Afinação: De que elementos precisamos e como os colocamos em funcionamento.

 

O primeiro passo é colocar ao ponto o servidor. Os passos a realizar são as seguintes:

  1. Especificar os parâmetros de publicação
  2. Arrancar o Servidor Web
  3. Publicar e implementar os Serviços Web

Especificar os parâmetros de publicação: Em 4D, ir a 4D > Preferências > Web:


Normalmente, o porto 80 está utilizado pelo Servidor Web do sistema (Apache em Mac OS X). Para evitar possíveis conflitos em caso de que Apache esteja ativado, utilizaremos o 8080, por exemplo.


Especificamos um nome para identificar o domínio dos serviços web, sob o qual, publicarão os diferentes serviços. Ativando as opções que se mostram nos gráficos temos coberto os pontos 1 e 2.

No ponto 3 nos adentramos na parte mais técnica. O primeiro é criar um método em 4D, por exemplo WS_LongintTest. No Explorador, selecionamos o método WS_LongintTest e clicamos em Comentários. Entramos na seguinte descrição:

Este serviço aceita um número inteiro (Longint) e o retorna multiplicado por dois.

Na lista de métodos selecionamos o método e fazemos Controle-Clique e selecionamos Propriedades do método...

 

 

 

 

 

 

 

 

 

 


Selecionamos Oferecido como Serviço Web e Publicado em WSDL. Agora implementamos o serviço. Como exemplo fácil, permitiremos que o cliente envie um número inteiro ao servidor e este o retornará multiplicado por 2:

C_LONGINT($1;$0)

SOAP DECLARATION($1;Is LongInt ;SOAP Input ;"NúmeroDoCliente")

SOAP DECLARATION($0;Is LongInt ;SOAP Output ;"Resultado")

 

Guardamos as mudanças. A partir deste momento, o servidor já está publicando o serviço WS_LongintTest.

Como descobrir os serviços web disponíveis

Na estrutura do cliente, delegaremos a 4D a complicada tarefa de gerar um método que nos permita utilizar o serviço WS_LongintTest do servidor. É importante recalcar que desde o ponto de vista do cliente, não se sabe quantos serviços estão disponíveis, e muito menos como se denominam e que parâmetros requerem. Para poder descobrir os serviços (graças ao documento WSDL que o servidor enviará transparentemente), precisamos de dois dados:

No meu caso, o servidor Vendas encontra-se no IP 192.168.1.2 e publica os serviços web via porto 8080.
No 4D, selecionar Ferramentas > Assistente Serviços Web:


Entramos 192.168.1.5:8080/4DWSDL e clicamos em Comprovar. Se tudo vai indo bem, aparecerão os serviços web sob o domínio especificado no gráfico 3. Selecionamos WS_LongintTest da lista esquerda e aparecerá uma série de detalhes ao pé da janela (talvez seja necessário clicar em Advanced para poder vê-los corretamente).

Sem entrar em detalhes, podemos comprovar que WS_LongintTest aceita um número inteiro e retorna outro. Graças a que especificamos uns comentários no método WS_LongintTest (servidor), este é incluído no WSDL, de forma que ao descobri-lo nos permite entender quê função realiza.

Para continuar, clicamos em Create e deixamos que 4D crie um método chamado WS_LongintTest e que se encarregará de chamar o serviço web. Este método, denominado "método proxy" e gerado automaticamente, contém o seguinte:

 

  ` WS_LongintTest

  ` url: 192.168.1.5:8080/4DWSDL

  ` Method source code automatically generated by the 4D SOAP wizard.

  `------------------

C_LONGINT($1)

C_LONGINT($0)

SET WEB SERVICE PARAMETER("NúmeroDoCliente";$1)

CALL WEB SERVICE(" http://192.168.1.5:8080/4DSOAP/ ";"WS_Servidor#WS_LongintTest";"WS_LongintTest";" http://www.4d.com/namespace/default ";Web Service Dynamic )

If (OK=1)

    GET WEB SERVICE RESULT($0;"Resultado";*)  ` Memory clean-up on the final return value.

End if

 

Utilização do método WS_LongintTest

Tudo que temos a fazer é criar um método que utilize WS_LongintTest, passando os parâmetros adequados. Criamos o método Provar_ WS_LongintTest:

C_LONGINT($Numero;$NumeroPorDois)

$Numero:=125

$NumeroPorDois:=WS_LongintTest ($Numero)

ALERT("Número enviado ao servidor: "+String($Numero))

ALERT("Número retornado pelo servidor: "+String($NumeroPorDois))

Guardamos as mudanças e executamos o método. Se todo vai bem, deveríamos ver as seguintes alertas:


Outro exemplo: passar dados via arrays

Um elemento muito utilizado na hora de passar informação são os arrays, os quais permitem incluir um número variável de elementos. O seguinte exemplo ilustra como utilizar arrays: o cliente passa um array com os números do mês que deseja e o servidor retorna um array com os nomes do mês relacionados.

Um passo importante é a criação de um método especial chamado COMPILER_WEB no servidor. Este método contém as declarações dos parâmetros utilizados pelos serviços web e é requerido por 4D. Eu declaro os parâmetros genéricos que utilizo, como por exemplo, aSOAPLongint, aSOAPText, etc.

O primeiro passo é criar o método COMPILER_WEB no servidor. Acrescentaremos o seguinte:

ARRAY LONGINT(aSOAPLongint;0)

ARRAY TEXT(aSOAPText;0)


O segundo passo, é criar o Serviço Web no servidor. O chamaremos WS_NomesDeMeses:

SOAP DECLARATION(aSOAPLongint;LongInt array ;SOAP Input ;"NúmerosDoMes")

SOAP DECLARATION(aSOAPText;Text array ;SOAP Output ;"NomesDoMes")

C_LONGINT($i;$Elementos;$Mes)

$Elementos:=Size of array(aSOAPLongint)

INSERT ELEMENT(aSOAPText;1;$Elementos)

For ($i;1;$Elementos)

    $Mes:=aSOAPLongint{$i}

    Case of

        :($Mes=1)

            aSOAPText{$i}:="Janeiro"

        :($Mes=2)

            aSOAPText{$i}:="Fevereiro"

        :($Mes=3)

            aSOAPText{$i}:="Março"

        :($Mes=4)

            aSOAPText{$i}:="Abril"

        :($Mes=5)

            aSOAPText{$i}:="Maio"

        :($Mes=6)

            aSOAPText{$i}:="Junho"

        :($Mes=7)

            aSOAPText{$i}:="Julho"

        :($Mes=8)

            aSOAPText{$i}:="Agosto"

        :($Mes=9)

            aSOAPText{$i}:="Setembro"

        :($Mes=10)

            aSOAPText{$i}:="Outubro"

        :($Mes=11)

            aSOAPText{$i}:="Novembro"

        :($Mes=12)

            aSOAPText{$i}:="Dezembro"

        Else

            aSOAPText{$i}:="<desconhecido>"

    End case

End for

Não tem que esquecer de ajustar os Parâmetros do método.

O terceiro passo é descobrir o serviço web desde o cliente, criar o método automaticamente via o Assistente de Serviços Web (WS_NomesDeMeses) e acrescentar um método que o utilize. O chamaremos Provar_ WS_NomesDeMeses:

ARRAY LONGINT(aMeses;4)

aMeses{1}:=3

aMeses{2}:=5

aMeses{3}:=9

aMeses{4}:=15  `Não existe!

ARRAY TEXT(aNomes;0)

C_POINTER($aNomesPtr)

$aNomesPtr:=WS_NomesDeMeses (->aMeses;->aNomes)

ALERT("Nome do mes "+String(aMeses{1})+": "+$aNomesPtr->{1})

ALERT("Nome do mes "+String(aMeses{2})+": "+$aNomesPtr->{2})

ALERT("Nome do mes "+String(aMeses{3})+": "+$aNomesPtr->{3})

ALERT("Nome do mes "+String(aMeses{4})+": "+$aNomesPtr->{4})

Depois da execução deste método veremos uma série de alertas similares à seguinte:


Como pudemos comprovar, pôr em funcionamento os serviços web em 4D não é nada complicado. Os exemplos mostrados são simples, mais ilustram o procedimento básico que permite transferir informação do cliente ao servidor e vice-versa.

Podem utilizar as seguintes data types: BLOB, Boolean, Integer, Longint, Real, String, Text, Date, Time, assim como arrays de Boolean, Integer, Longint, Real, String e Text.

 

                                                                           Tito Ciuro
 
                                                                         Miami – Maio de 2005

 

 

 


Internacional | Empresa | Contatar 4D | Mapa do Site | © 4D, S.A. 2008 | Tamanho da fonte: [A] [A] [A] *Quando a solução é o que importa