Vous êtes sur la page 1sur 2

CONSUMIR UN WEB SERVICE DESDE UN PROGRAMA RPG/400

Hace unos días me encargaron un proyecto en una entidad donde el 100 % de su software en
producción está desarrollado con Genexus, en la plataforma AS/400 V5R4M00 procesando
programas generados en RPG nativo. El proyecto implicaba conectarse desde un programa RPG a
un web service externo, obtener datos de validación, confirmar la operación en el web service
actualizando su base de datos externa y finalmente registrar los datos en la base de datos Iseries.

Genexus no soporta ese tipo de operaciones en la plataforma AS/400, por lo que tuve que buscar
alternativas a mano, aunque Google no fue de demasiada ayuda, ya que no hay demasiada
experiencia sobre este tema. Supongo que se considera un poco pasado de moda el RPG/400.

RPG es bastante áspero para comunicarse con otras plataformas on-line, salvo cuando fija las
reglas. No me servía APPC (me pareció demasiado complicado organizar eso), ni tampoco el ODBC
porque las transacciones se originaban en el ambiente nativo. Si el caso hubiera sido el inverso
(generar transacciones que afecten la base de datos nativa) la solución era trivial. Una opción
razonable era usar las DTAQ, que pueden ser accedidas desde ambiente nativo y Windows, pero
me complicó tener una cantidad no definida de usuarios concurrentes. El indexado de las DTAQ es
limitado. Por otra parte, me obligaba a tener un servidor adicional activo para poder interactuar
con el web service externo en ambiente PC, con los problemas que esto conlleva (de
mantenimiento y control sobre todo).

Buscando por la red, encontré una biblioteca OpenSource para administrar sockets y generar HTTP
desde RPG/400, de un gordito llamado Scott Klement (http://www.scottklement.com/), bajé todo
lo que hay en el sitio y me puse a estudiar. No soy un experto en ILE RPG ni mucho menos,hace
muuuucho tiempo que no programo manualmente, así que me costó bastante el tema.

Para preparar el escenario, creé un Web Service en mi localhost con Genexus X WEB muy simple,
solamente recibe un tipo y número de documento y devuelve el nombre del cliente desde una
base de datos MySQL. Hice un work panel cliente en genexus 9.0 WIN para probar el
funcionamiento desde otra pc y todo funcionó sin problemas. Para ver bien el Web Service bajé un
software llamado SOAPUI (open source) de http://www.soapui.org/ que permite testear y
observar Web Services que es bastante bueno.

Usando su LIBHTTP/QRPGLESRC/EXAMPLE18 como modelo,empecé a meter mano. Primer


problema, hay que armar el XML de envío a mano y para eso me fue útil la estructura del Soapui.
Segundo problema, el mensaje que se recibe es XML y tuve que parsearlo a mano. (Prueba y error)
* n veces más no pude hacer que funcionara con mi web service el parsing del modelo.

Dándole vueltas al tema me topé con un sitio (Isockets.com) de Bob Cozzi, que tiene una biblioteca
de rutinas que manejan los sockets del AS/400. Bajé la biblioteca, la instalé en mi equipo y empecé
a probar. En definitiva me pareció mucho más fácil de usar y una ayuda bastante más detallada.
Para la versión V5R4M0 es imprescindible tener aplicadas algunas PTF’s, principalmente la
MF40520 (importante porque el source sí se cobra).

El proceso de comunicación, partiendo del modelo que hay en la biblioteca, fue bastante simple.
Igualmente hay que armar a mano el xml de envío (para eso usé SoapUI). En teoría el HttpParse se
encarga de desarmar el xml de recepción pero no logré hacerlo funcionar, al igual que el
XML_INTO del ILE RPG. Me parece que alguno de los datos adicionales (el namespace u otro) que
el web service generado por Genexus envía no son entendibles por el XML-INTO o por el DAX.
Tampoco me puse a averiguar demasiado porque usando %SUBST y %SCAN en un minuto se
“pela” el xml, dejando en variables los datos reales que quiero.

También hay herramientas en


http://www.tools400.de/English/Freeware/WSDL2RPG/wsdl2rpg.html, pero ya tenía el asado
listo, así que simplemente lo miré un poco. Parece bueno pero son solo las herramientas sin
demasiados ejemplos de uso.

En resumen, los programas RPG de la aplicación hechos en Genexus llaman con parámetros a un
pequeño programa de comunicaciones también ILE RPG, que mediante HTTP accede al web
service y devuelve los datos solicitados. No es necesario usar absolutamente nada de los
servidores locales, salvo el browser ni hacer programas java. Creo que quedó una solución
elegante.

El tema que me queda pendiente es el SSL, porque los tipos del web service externo usan un
certificado propio (no Verisign ni los comunes) y me obligan a configurar mi AS/400 para manejar
certificados digitales. Aún no lo pude probar pero parece ser alguito complicado. Si les toca lo
mismo, vean el manual de Security Digital Certificate Manager de IBM como para empezar.

Algo de bibliografía para buscar, si lo necesitan es:

http://www.scottklement.com/

http://www.recursos-as400.com/documentos.shtml

http://www-01.ibm.com/support/docview.wss?rs=959&uid=swg27009770

http://www.ibm.com/developerworks/webservices/library/ws-as400/index.html

http://systeminetwork.com/article/rpg-consuming-web-services-httpapi-and-soapui

http://www.isockets.net/

http://www.soapui.org/

http://www.tools400.de/English/Freeware/WSDL2RPG/wsdl2rpg.html

http://www.rpg-xml.com/ - Parece completito pero es pago, así que ni bajé el trial, pero...