When the solution matters*

| Clientes | Historias de éxito | Buscador de soluciones | Perfiles |

Compañía General de Esencias

Servicios Web en práctica
Por Tito Ciuro

 

En mi artículo anterior exponía por qué los Servicios Web abren un mundo de oportunidades. No se trata de un detalle exhaustivo ni mucho menos, sino de una breve introducción que pretendía presentar el concepto de los Servicios Web y dar una serie de ideas desde un punto de vista práctico. En este segundo artículo quiero ir más allá y explicar una serie de técnicas para poder publicar y suscribirse a Servicios Web utilizando 4D.

 

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:

  1. Especificar los parámetros de publicación
  2. Arrancar el Servidor Web
  3. Publicar e implementar los Servicios Web

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

 

 

 


Internacional | Empresa | Contactar 4D | Mapa del Sitio | © 4D, S.A. 2008 | Tamaño de fuente: [A] [A] [A] *Cuando la solución es lo que importa