WSDL Inspector

Alcance

Lenguajes: Java, .NET, Visual Basic

Interfaces: Win, Web

 

Introducción

El WSDL Inspector permite a partir del WSDL de un web service definir los tipos de datos necesarios en GeneXus para poder consumir el web service en forma transparente sin tener que preocuparse de los protocolos involucrados en el proceso y la definición del mismo.

 

Descripción

El WSDL de un web service es un archivo que describe al mismo; brinda toda la información necesaria para poder consumirlo.

GeneXus brinda una herramienta llamada WSDL Inspector que permite a partir del WSDL de un web service definir en la base de conocimientos todo lo necesario para poder consumir los métodos del web service en forma transparente.

 

Para acceder al WSDL Inspector hay que ejecutar la opción Tools/WSDL Inspector. La misma esta solo accesible desde Design.

 

 

 

En “Web Service URL” se debe ingresar el camino hacia el WSDL. Puede ser referenciado por medio del protocolo http (por ej. http://api.google.com/GoogleSearch.wsdl ) o file (por ej. file:C:\Servicios\AmazonWebServices.wsdl).

Una vez ingresado el camino del WSDL se debe presionar el botón “Inspect”, con lo cual en caso de no existir ningún error se mostrará la información de los distintos métodos que brinda el web service, junto con los tipos de datos necesarios para poder consumirlos.

Para poder “importar” la información necesaria dentro de la base de conocimientos que permita consumir el web service se debe presionar el botón “Add Reference”.

 

En la imagen anterior se muestra la información de un web service simple, el cual cuenta con un solo método llamado BabelFish que recibe dos parámetros de entrada de tipo Carácter y retorna otro parámetro de tipo Carácter.

 

El siguiente ejemplo muestra otro caso en el cual el web service cuenta con mas de un método y se necesita definir nuevos tipos de datos(ArrayOfNewsCategoty, NewsCategoty, ArrayOfBusnessShortNews, BusnessShortNews):

 

 

 

Add Reference

Como se mencionó anteriormente al presionar el botón “Add Reference” se genera dentro de la base de conocimientos los tipos de datos necesarios para poder consumir el web service en forma trasparente. O sea, se genera un tipo de datos que identifica el web service y en caso de que el mismo necesite nuevos tipos de datos se genera un tipo de datos estructurado para cada uno de ellos.

De esta forma se puede definir una variable a la cual asignarle el tipo de datos definido para el web service y utilizando los métodos de la misma poder invocar a los distintos métodos que el web service provee. Si para consumir el método se necesitan tipos de datos estructurados hay que crear variables con los tipos de datos estructurados creados por el Inspector.

 

Invocación de los métodos de un  web service

Método sin tipos de datos estructurado

 

Volvamos entonces a la primera imagen para poder mostrar en un caso sencillo como poder consumir un web service.

En este caso al presionar el botón ‘Add Reference’ se agrega a los tipos de datos que maneja GeneXus, el tipo  “net_xmethods_wwwsd_BabelFishService.BabelFishService”.

 (Notar que en el nombre asignado al tipo de datos esta precedido por el namespace que identifica al web service, de esta forma GeneXus  asegura que no van a existir dos tipos de datos con el mismo nombre para distintos web services).

De esa forma se puede definir una variable a la cual asignarle ese tipo de datos; llamaremos a la misma “ws”.

Luego podremos invocar utilizando la variable “ws” a cualquiera de los métodos que el web service provee (en este caso solo uno) de la siguiente forma:

 

&result = &ws.BabelFish(&traslationmode, &source)

 

Donde &result, &traslationmode y &source son variables de tipo character.

 

Eso es todo!, de esta forma se puede invocar a un web service en forma sencilla sin tener que preocuparse de los protocolos involucrados en el proceso y la definición del mismo; solamente se tuvo que dar la ubicación de su WSDL y GeneXus se encargó de esconder la complejidad y definir un tipo de datos que represente al web service.

 

Método con tipo de datos estructurado

Ahora vamos a consumir un webservice que utiliza dos tipos de datos estructurados.

Al importar el webservice en GeneXus se crea la siguiente:

·         Un nuevo tipo de datos correspondiente al webservice (com_swanandmokashi.Horoscope)

·         Un tipo de dato estructurado llamado ZodiacSigns con la siguiente definición:

§         ZodiacSign       Character(9999)

§         DailyForecast   Character(9999)

·         Un tipo de dato estructurado llamado ArrayOfZodiacSigns con la siguiente definición:

§         ArrayOfZodicSigns collection of ZodiacSigns

 

Para consumir el webservice se tiene el siguiente código:

&array = &ws.GetHoroscope()

For &item in &array

    &SodiacSign = &item.ZodiacSign

    &ForeDailiy = &item.DailyForecast

    load

endfor

 

Donde:

         &ws es de tipo com_swanandmokashi.Horoscope

         &array es de tipo ArrayOfZodicSigns

         &item es de tipo ZodiacSigns

 

De esta forma se consume un webservice que usa tipos de datos estructurados.

 

 

NOTA: En el caso de tipos de datos booleanos, se debe utilizar el tipo de datos numérico N(1). El valor 1 se corresponde con el True, y el 0 con el False.

 

Uso de locations en el consumo de web services

De la misma forma que con el llamado de los procedimientos SOAP, es posible modificar diferentes parámetros de la invocación de web services utilizando los locations.

 

El nombre del location (indicado en el tag    <GXLocation name=> del archivo location.xml, que debe utilizarse es el nombre que

GeneXus le asigna al tipo de datos creado por el Wsdl Inspector para el servicio, sustituyendo el ultimo punto (.) por un underscore (_).

Por ejemplo, en el caso del webservice de Horóscopo anterior, en GeneXus el tipo de datos para el servicio muestra:

 

com_swanandmokashi.Horoscope

 

El location que se deber utilizar en este caso es:

 

com_swanandmokashi_Horoscope

 

El archivo location.xml debe de estar en el directorio corriente y solo se toma en cuenta en tiempo de ejecución.

 

Por ejemplo si se quiere redireccionar el web service a localhost:88 se tiene que tener un location.xml de la siguiente forma:

 

<GXLocations>

   <GXLocation name="com_swanandmokashi_Horoscope">

      <Common>

         <Host>localhost</Host>

         <Port>88</Port>

      </Common>

      <HTTP>

         <BaseURL>/HomePage/WebServices/</BaseURL>

      </HTTP>

   </GXLocation>

</GXLocations>

 

Ejemplo

En el GXOpen se encuentra una KB de ejemplo en la cual se consumen tres web services; GXChart (servidor de gráficas), Babelfish (traductor de textos) y GetJoke (provee chistes agrupados por categorías).

El mismo puede ser obtenido en http://www.gxopen.com/main/hproject.aspx?176

 

Consideraciones

·         Para consolidar objetos que tengan variables de tipos de datos asociados a web services, es necesario previamente agregar la referencia con el WSDL Inspector en la KB destino. Otra opción es copiar los archivos asociados al web service desde el directorio <dir.KB>\kbdata\usrtypes de la KB origen a la destino (se generan dos archivos con extensiones .ari y .xml por cada web service agregado, que contienen las definiciones del mismo). Además, luego de consolidarlo, es necesario en el objeto borrar y volver a definir la/s variable/s de ese tipo, de lo contrario se producirá un error de especificación:

 

spc0056,   Internal error. Variable <variable> definition is incorrect or not available. Data:<tipo>.

 

·         Cuando se compila un objeto main se compilan todos tipos de datos definidos en lugar de compilar solo los usados por ese main.

 

·         No se puede utilizar el WSDL Inspector para consumir web services con los generadores VFP y C/SQL