Hace poco inicie un proyecto de uso interno en la empresa, el cual consiste en abrir otra puerta a nuestro "Web Services Provider" (el cual es parte de Informática PowerCenter), para poder ejecutar Workflows desde un front. Esto para algunos usuarios que no necesitan aprender a ejecutarlos desde el "Workflow Designer", ó incluso a mi, para probar el workflow en ambientes con más controles como QA y producción.
La mayor parte son proceso "batch" y no pueden tener un criterio de ejecución programada. Generalmente son usados para hacer algunas cargas masivas de información.
Para desarrollar el proyecto, se esta haciendo uso de los web services que están publicados en el Web services HUB, dentro de la carpeta Batch WebService, con ellos se pueden ejecutar y detener workflow, también se puede obtener información de la ejecución e incluso el log. Abajo se muestra una imagen de ello.
Para poder ejecutar varias de las operaciones disponibles por los web services, es necesario iniciar una sesión y posteriormente debe incluirse el valor de dicha sesión en cada "request".
Cito un párrafo del manual "PowerCenter 9.1.0 Web Services Provider Guide", el cual se encuentra en la página 8 del capitulo 2, donde se habla un poco sobre el autenticado. En la parte de abajo, puedes descargar el PDF completo.
"Authentication. For batch web services, the web service client application must call the Login operation before it calls other operations. The Web Services Hub authenticates the request based on the session ID.
For protected real-time web services, the Web Services Hub authenticates the web service client based on the user name token. The web service client must include the user name token in every SOAP request sent to the Web Services Hub. The user name token can include a plain text, hashed, or digested password.
The Web Services Hub does not authenticate web service requests for a public real-time web service."
El valor del "session ID" debe incluirse en el "SOAP Header" de las peticiones.
A continuación se muestra un ejemplo de como agregar el valor de nuestra sesión a todas las peticiones, a través de un "SOAP Handler" ;-], sería conveniente que leyeras mi publicación anterior, ya que ahí se explica como agregar este "SOAP Handler", como están declarados los beans y como son inyectados por medio de Spring.
1.- Como inyectar el ID de sesión dentro del "header" de nuestras peticiones SOAP:
Lo que hace esta clase, es interceptar las peticiones y respuesta SOAP, por lo tanto se comprueba si se trata de una petición, de ser cierto, agregamos el elemento header siempre y cuando, no exista dentro del XML de la petición, después se agrega un elemento llamado "Context", el cual contendrá otro llamado "SessionId", quien finalmente tendrá asignado el valor de la sesión. Más detalles pueden ser consultados en la página 49 del mismo manual, dentro del tópico "Java Client Application for Batch Web Services".
El XML final se verá algo parecido a esto:
Espero subir pronto un proyecto de ejemplo completo a github ;-]