Prerrequisitos
Aunque se puede programar con 4D Server y 4D Client, este artículo se basa en 4D (versión monousuario), utilizando la versión 2003.6 en Mac OS X (Panther y Tiger, 10.3.9 y 10.4.1 respectivamente).
Problema inicial: cómo poder acceder a una serie de datos localizados en una base de datos externa.

Ventas (servidor) contiene la base de datos con los clientes, pedidos, facturas, comerciales, etc. El Director de Ventas (cliente), desea visualizar los comerciales dados de alta en el servidor. Esta consulta se podría realizar con 4D, 4D Server o 4D Client. Para que la consulta se pueda llevar a cabo, el servidor deberá publicar los servicios que ofrece. Sin embargo, ¿cómo se puede averiguar (descubrir) qué servicios ofrece un servidor? Sin tener acceso al programador o al código fuente, sería muy difícil, por no decir imposible, llevar a cabo esa tarea.
La solución viene de la mano de WSDL, un documento que el servidor publica y que el cliente puede analizar para averiguar qué servicios están presentes. Mediante el Web Services Wizard de 4D, implementar un método que se suscriba al servidor es realmente fácil.
Puesta a punto: qué elementos necesitamos y cómo los ponemos en marcha.
El primer paso es poner a punto el servidor. Los pasos a realizar son los siguientes:
Especificar
los parámetros de publicación: En 4D, ir a 4th Dimension > Preferencias > Web:

Normalmente, el puerto 80 está utilizado por el Servidor Web del sistema (Apache en Mac OS X).
Para evitar posibles conflictos en caso de que Apache esté activado, utilizaremos
el 8080, por ejemplo.

Especificamos un nombre para identificar el dominio de los servicios web
bajo el cual se publicarán
los diferentes servicios. Activando las opciones que se muestran en los gráficos
hemos cubierto los puntos 1 y 2.
En el punto 3 nos adentramos ya en la parte más técnica. Lo primero es crear un método en 4D, por ejemplo WS_LongintTest. En en Explorador, seleccionamos el método WS_LongintTest y hacemos click en Comentarios. Entramos la siguiente descripción:
Este servicio acepta un número entero (Longint) y lo devuelve multiplicado por dos.
En
la lista de métodos seleccionamos el método y hacemos Control-click
y seleccionamos Propiedades del método...

Seleccionamos
Ofrecido como Servicio Web y Publicado en WSDL. Ahora implementamos el
servicio. Como ejemplo fácil, permitiremos que el cliente envíe
un numero entero al servidor y éste lo devolverá multiplicado
por 2:
C_LONGINT($1;$0)
SOAP DECLARATION($1;Is LongInt ;SOAP Input ;"NumeroDelCliente")
SOAP DECLARATION($0;Is LongInt ;SOAP Output ;"Resultado")
Guardamos los cambios. A partir de este momento, el servidor ya está publicando el servicio WS_LongintTest.
Cómo descubrir los servicios web disponibles
En la estructura del cliente, delegaremos a 4D la complicada tarea de generar un método que nos permita utilizar el servicio WS_LongintTest del servidor. Es importante recalcar que desde el punto de vista del cliente, no se sabe cuantos servicios están disponibles, y mucho menos cómo se denominan y que parámetros requieren. Para poder descubrir los servicios (gracias al documento WSDL que el servidor enviará transparentemente), necesitamos dos datos:
En mi caso, el servidor Ventas se encuentra en la IP 192.168.1.2 y publica
los servicios web via puerto 8080.
En 4D, seleccionar Herramientas > Asistente
Servicios Web:

Entramos 192.168.1.5:8080/4DWSDL y hacemos click en Comprobar. Si todo
va bien, aparecerán los servicios web bajo el dominio especificado en el gráfico
3. Seleccionamos WS_LongintTest de la lista izquierda y aparecerá una
serie de detalles a pie de ventana (quizá sea necesario hacer click
en Advanced para poderlos ver correctamente).
Sin entrar en detalles, podemos comprobar que WS_LongintTest acepta un numero entero y devuelve otro. Gracias a que especificamos unos comentarios en el método WS_LongintTest (servidor), éste es incluido en el WSDL, de forma que al descubrirlo nos permite entender que función realiza.
Para continuar, hacemos click en Create y dejamos que 4D cree un método llamado WS_LongintTest y que se encargará de llamar el servicio web. Este método, denominado "método proxy" y generado automaticamente, contiene lo siguiente:
` 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("NumeroDelCliente";$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
Utilización del método WS_LongintTest
Todo lo que tenemos que hacer es crear un método que utilice WS_LongintTest, pasando los parámetros adecuados. Creamos el método Probar_ WS_LongintTest:
C_LONGINT($Numero;$NumeroPorDos)
$Numero:=125
$NumeroPorDos:=WS_LongintTest ($Numero)
ALERT("Número enviado al servidor: "+String($Numero))
ALERT("Número devuelto por el servidor: "+String($NumeroPorDos))
Guardamos los cambios y ejecutamos el método. Si todo va bien, deberíamos ver las siguientes alertas:

Otro ejemplo: pasar datos vía arrays
Un elemento muy utilizado a la hora de pasar información son los arrays, los cuales permiten incluir un numero variable de elementos. El siguiente ejemplo ilustra como utilizar arrays: el cliente pasa un array con los números del mes que desea y el servidor devuelve un array con los nombres del mes relacionados.
Un paso importante es la creación de un método especial llamado COMPILER_WEB en el servidor. Éste método contiene las declaraciones de los parámetros utilizados por los servicios web y es requerido por 4D. Yo declaro los parámetros genéricos que utilizo, como por ejemplo aSOAPLongint, aSOAPText, etc.
El primer paso es crear el método COMPILER_WEB en el servidor. Añadiremos lo siguiente:
ARRAY LONGINT(aSOAPLongint;0)
ARRAY TEXT(aSOAPText;0)
El segundo paso, es crear el Servicio Web en el servidor. Lo llamaremos WS_NombresDeMeses:
SOAP DECLARATION(aSOAPLongint;LongInt array ;SOAP Input ;"NumerosDelMes")
SOAP DECLARATION(aSOAPText;Text array ;SOAP Output ;"NombresDelMes")
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}:="Enero"
:($Mes=2)
aSOAPText{$i}:="Febrero"
:($Mes=3)
aSOAPText{$i}:="Marzo"
:($Mes=4)
aSOAPText{$i}:="Abril"
:($Mes=5)
aSOAPText{$i}:="Mayo"
:($Mes=6)
aSOAPText{$i}:="Junio"
:($Mes=7)
aSOAPText{$i}:="Julio"
:($Mes=8)
aSOAPText{$i}:="Agosto"
:($Mes=9)
aSOAPText{$i}:="Septiembre"
:($Mes=10)
aSOAPText{$i}:="Octubre"
:($Mes=11)
aSOAPText{$i}:="Noviembre"
:($Mes=12)
aSOAPText{$i}:="Diciembre"
Else
aSOAPText{$i}:="<desconocido>"
End case
End for
No hay que olvidar ajustar los Parámetros del método.
El tercer paso es descubrir el servicio web desde el cliente, crear el método automaticamente via el Asistente de Servicios Web (WS_NombresDeMeses) y añadir un método que lo utilice. Lo llamaremos Probar_ WS_NombresDeMeses:
ARRAY LONGINT(aMeses;4)
aMeses{1}:=3
aMeses{2}:=5
aMeses{3}:=9
aMeses{4}:=15 `No existe!
ARRAY TEXT(aNombres;0)
C_POINTER($aNombresPtr)
$aNombresPtr:=WS_NombresDeMeses (->aMeses;->aNombres)
ALERT("Nombre del mes "+String(aMeses{1})+": "+$aNombresPtr->{1})
ALERT("Nombre del mes "+String(aMeses{2})+": "+$aNombresPtr->{2})
ALERT("Nombre del mes "+String(aMeses{3})+": "+$aNombresPtr->{3})
ALERT("Nombre del mes "+String(aMeses{4})+": "+$aNombresPtr->{4})
Tras la ejecución de este método veremos una serie de alertas similiares a la siguiente:

Como hemos podido comprobar, poner en marcha los servicios web en 4D no
es nada complicado. Los ejemplos mostrados son simples, pero ilustran el
procedimiento básico que permite trasladar información del cliente
al servidor y viceversa.
Se pueden utilizar los siguientes data types: BLOB, Boolean, Integer, Longint, Real, String, Text, Date, Time, así como arrays de Boolean, Integer, Longint, Real, String y Text.
Tito
Ciuro
Miami – Mayo
2005
Artículo
general
El suave perfume de los servicios Web
Anexo 2
Servicios Web avanzados