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:
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
Artigo
geral
O suave perfume dos serviços Web
Anexo 2
Serviços Web avançados