Exponer y Consumir Servicio SOAP en GeneXus 16


En el siguiente ejemplo, veremos como exponer de manera rápida y sencilla un servicio SOAP, el cual a través de un nombre de una receta, permite saber cuales son los ingredientes que se necesitan para hacer la misma. Para eso tomare como referencia la siguiente transacción: 


Creamos un SDT para guardar todos los ingredientes de una receta.
La Estructura del SDT es la siguiente:


Luego creamos un procedimiento y editaremos su propiedad Call protocol a SOAP


En las reglas del procedimiento se recibirá un nombre de receta y le devolveremos el SDT con todos los ingredientes que se necesitan para realizar la receta:


En el source recorro la tabla Receta filtrando por el nombre que recibo por parámetros, luego recorro la tabla hija y guardo todos los ingredientes de la receta en el SDT:

Source del procedimiento:
&SDTIngredientes.Clear()

For each Receta
Where RecetaNombre.ToUpper().Trim() = &RecetaNombre.ToUpper().Trim()
For each Receta.Ingrediente
&SDTIngredientesItem = New()
&SDTIngredientesItem.IngredienteNombre = IngredienteNombre
&SDTIngredientesItem.IngredienteCantidad = IngredienteCantidad
&SDTIngredientesItem.IngredienteUnidad = IngredienteUnidad
&SDTIngredientes.Add(&SDTIngredientesItem)
Endfor
Endfor
 
Compilamos y visitamos este procedimiento, nuestro servidor de aplicaciones (en este ejemplo uso Tomcat) debe devolver un WSDL como este: 


Ahora todo está listo para consumir el servicio desde otra Aplicación.

Para esto, en una KB distinta, debemos importar el WSDL haciendo: 


Se abrirá un popup donde indicaremos donde está alojado el servicio a consumir (URL del WS), y presionamos next. 


Luego indicamos un nombre para el objeto externo que creara GeneXus, y le damos next


En el siguiente popup se mostrara información importante con respecto al objeto externo, ejemplo: que parámetros recibe, que devuelve, etc. Le damos import.


Genexus automáticamente generará en la KB 2 objetos nuevos, el objeto externo y el SDT de los ingredientes:


Si procedemos a abrir el objeto externo podremos visualizar que tiene un método llamada Execute el cual recibe el nombre de la receta, este método es el que nos permitirá consumir el servicio:
Para consumir el servicio me creare un Web Panel con las siguientes características:

Variables:


WebForm:


Eventos del web panel:
Event 'ConsumirServicio'
&SDTIngredientes.Clear()
If &Nombre_Receta.IsEmpty()
Msg('Debe seleccionar una receta a consultar')
Else
&SDTIngredientes = &WebService.Execute(&Nombre_Receta)
Endif
Grid1.Refresh()
EndEvent

Event Grid1.Load
For &SDTIngredientesItem in &SDTIngredientes
&IngredienteNombre = &SDTIngredientesItem.IngredienteNombre 
&IngredienteCantidad = &SDTIngredientesItem.IngredienteCantidad
&IngredienteUnidad = &SDTIngredientesItem.IngredienteUnidad
Load
Endfor
EndEvent

Como se puede observar en el código el consumo del servicio se hace cuando se invoca el método Execute. Luego mostramos los datos consultados por WS en la grilla.

Comentarios

  1. Muy útil la información, gracias!
    Actualmente tengo la duda de como modificar el header del response de un WS publicado con Genexus 16 para agregar datos como token o usuario y contraseña. ¿Has desarrollado algo similar con ws expuestos por genexus?

    ResponderBorrar

Publicar un comentario