viernes, 11 de octubre de 2013

¿REST o RESTful? ¿Qué es lo que implementamos realmente?

Y llegamos a la última entrada de mi blog, esta vez prometo no hablar nada, pero nada de PeopleSoft ajajajajaja. Ahora les hablaré de REST y la disyuntiva que se presenta cuando creemos que estamos implementando RESTful y verdaderamente no es así. Ayer que estaba en la exposición final del proyecto de DSD el profesor me pidió una conclusión final acerca de mi proyecto; por esta razón, le comenté una solución que, para mi, era la mejor alternativa a un problema que quizás muchos de nosotros hemos tenido a lo largo del desarrollo de nuestros proyectos. El profesor, fiel a su estilo colaborativo, risueño y siempre con la precisa, me comentó que justamente eso que hice en mi proyecto permitía discernir si realmente estamos empleando REST o RESTful cuando nos enrumbamos a trabajar con métodos HTTP, Json, Fredys Kruger y demás ajajajaja.

Dejando a un lado las bromas, aprendí que la diferencia entre emplear REST y RESTful radica justamente en la últimas tres palabras que no tienen en común (ful). Esto significa que, aunque estemos trabajando con tramas Json y métodos HHTP al momento de implementar servicios, realmente no estamos aprovechando al 100% la funcionalidad REST. Específicamente, me refiero al hecho de emplear hipervínculos que nos permitan navegar de una clase a otra de modo que podamos aprovechar estructuras de otras clases estando en una clase que posee, digámoslo así, propiedades del tipo Foreign Key.
Pongamos un ejemplo, tengo la siguiente clase:


Podemos observar que, la clase Excepción tiene varias propiedades, algunas del tipo de datos clásico: int, DateTime y String y otras del tipo de datos clase: por ejemplo Usuario que es una extensión de la clase Usuario. Justamente aquí radica la razón de ser de esta entrada en mi blog. A la pregunta: ¿Como desarrollo la trama Json para poder insertar un nuevo registro de Excepción mediante REST?

Entonces me llevé con la sorpresa de que, al igual que WSDL, si deseo pasar la trama Json de esta clase debo considerar escribir no solo la estructura de la clase Excepción sino también, la estructura en árbol de la clase Usuario... como lo leen, la estructura completa de esta clase. Digamos que, la clase Usuario tiene 30 propiedades, estas mismas 30 propiedades deben ser escritas en la trama Json para registrar una Excepción común y corriente de 8 siemple campitos. Ahora bien, que sucede si dentro de la estructura de la clase Usuario tengo una situación similar a la de la clase Excepción; osea que, dicha clase cuente a su vez con propiedades que se extienden de otras clases (todo esto sin contar que la clase Usuario no es la única que aparece en la clase Excepcion). En conclusión, la trama Json que debemos escribir para poder registrar un a simple Excepcion se extendería de una manera trabajosa (por la cantidad de código que hay que digitar) y peligrosa (por la exposición innecesaria que haremos de otras clases al acceder a un solo recurso).

La solución, digamos muy utilizada por la mayoría de programadores el día de hoy pero no recomendada porque nos evita llegar al tan ansiado RESTful, que le dí a este problema fué la siguiente:


Entonces, para un servicio que iba a ser implementado mediante el estilio de arquitectura REST creé dos clases: una para inserciones (POST) y actualizaciones (PUT) y la otra para operaciones select (GET). Como vuelvo a repetir, esta no es una buena práctica cuando se trabaja con REST pero, es la que actualmente usan la mayoría de programadores. Por lo menos, para mi y para mi grupo de DSD fué la que nos sacó del gran problema de tener que escribir tramas Json complejas y muy anidadas.

Es justamente esta salida, o criollada muy típica de nosotros los peruanos, la que evita que podamos desarrollar una implementación RESTful y nos quedemos solo en REST. La pregunta sería entonces: 

¿Como evitamos trabajar de esta forma?
Al igual que se puede serializar y deserializar propiedades tipo DateTime (Fecha) en cualquier Clase que creemos dentro nuestra carpeta Dominio (y esto de las fechas es un tema verdaderamente desgastado dado que, todos los ex alumnos de EPE ya lo han considerado en sus blogs), también podemos hacer lo mismo con propiedades que requieran obtener catálogos de otras clases (que a la larga se representan como un Foreign Key de Base de Datos). 

Concusiones Finales
El objetivo de esta entrada no fué explicar paso a paso como lograr la serialización JSON; sino, identificar el problema existente, definirlo, poder sacarle la vuelta de una manera creativa, pero no recomendada (como la mayoría de programadores lo hacen actualmente) y fomentar la buena práctica de la implementación RESTful. Por esta razón, he encontrado un muy buen artículo en la web de Microsoft que nos introduce a la implementación de una buena práctica RESTful:


IMPORTANTE: Si a pesar de que luego de haberte explicado la manera correcta como deberías implementar tus servicios REST para llegar al "ful" decides continuar con la práctica que realicé en mi proyecto... toma en cuenta los siguientes consejos:
  • La clase ExcepcionInsert solo debes utilizarla cuando realices Inserts (POST) y Updates (PUT).
  • Si deseas realizar Selects (GET) de todo tipo, debes utilizar la clase Excepcion (la cual incluye la clase con sus propiedades originales) porque, te permitirá obtener las descripciones de todas las clases embebidas de una manera mas sencilla (de lo contrario, tendría que hacer un drill down de clases para obtener las descripciones que pretendes mostrar en tus páginas).
  • Para mayor información puedes consultar esta implementación en el GoogleCode de mi proyecto (Grupo Innova): http://code.google.com/p/upc-epe-dsd-innova/source/browse/#svn%2Ftrunk%2FIncidenciasREST%253Fstate%253Dclosed

Espero haber contribuido un poco al conocimiento que posees sobre servicios REST.

Saludos

AAM

Especificación WS-BPEL... interesante mercado!!! Por última vez, PeopleSoft come to me!!!

Lo sé, lo sé!!! Esta es la tercera entrada que creo en mi blog en donde relaciono un tema visto en clases con el ERP Oracle PeopleSoft. No es que lo haga con ánimos de marketear la solución con la que trabajo (bueno, quizás un poco jajajajaja). Mi motivación principal radica en la posibilidad de tener en esta entrada un modelo de implementación de la especificación WS-BPEL en una tecnología propietaria. Como siempre he dicho, tener claro los conceptos nos permitirá implementar cualquier especificación, estilo o tipo de arquitectura en .NET, en JAVA, en PHP, o como ahora, en PeopleSoft.
 
¿Qué es WS-BPEL?
El Lenguaje de Ejecución de Procesos de Negocio con Servicios Web es un lenguaje estandarizado por OASIS para la composición de servicios web. Está desarrollado a partir de WSFL y XLANG, ambos lenguajes orientados a la descripción de servicios Web. Básicamente, consiste en un lenguaje basado en XML diseñado para el control centralizado de la invocación de diferentes servicios Web, con cierta lógica de negocio añadida que ayuda a la programación en gran escala (programming in the large). Antes de su estandarización se denominaba BPEL4WS.
 
¿Cuál es su propósito?
La programación en gran escala generalmente se refiere al desarrollo del software de gran tamaño que involucra grandes procesos de desarrollo, evolución y mantenimiento. Por otro lado, la programación detallada se refiere a la construcción de componentes de software pequeños y autónomos. El desarrollo de BPEL nace de la necesidad de manejar lenguajes distintos entre la programación a gran escala y la programación detallada, ya que en su esencia ambos tipos de desarrollo requieren de distintos grados de comunicación con otros servicios.
 
¿Qué es el lenguaje BPEL?
BPEL es un lenguaje de orquestación, no un lenguaje coreográfico. La mayor diferencia entre ambos es el ámbito. Un modelo de orquestación provee un ámbito específicamente enfocado en la vista de un participante en particular (ejemplo: un modelo par-a-par / point-to-point). En cambio, un modelo coreográfico abarca todos los participantes y sus interacciones asociadas, dando una vista global del sistema. Las diferencias entre orquestación y coreografía están basadas en analogías: la orquestación describe un control central del comportamiento como un director de orquesta, mientras que la coreografía trata sobre el control distribuido del comportamiento donde participantes individuales realizan procesos basados en eventos externos, como en una danza coreográfica donde los bailarines reaccionan a los comportamientos de sus pares.

Si imaginamos un flujo de negocio determinado, con una entrada X y una salida Y, este se podría componer de muchos procesos internos que se lanzarían dependiendo de valores y respuestas anteriores. BPEL sería el encargado de orquestar todo el proceso ordenando qué proceso ejecutar (Servicio Web) y en qué momento.
 
Este lenguaje fue concebido por grandes de la informática como Oracle, BEA Systems, IBM, SAP y Microsoft entre otros.
 
¿Qué posibilita el Lenguaje de Programación BPEL?
Adicionalmente a proveer facilidades para habilitar el envío y recepción de mensajes, el lenguaje de programación BPEL también posibilita:
 
1. Un mecanismo de correlación de mensajes basado en propiedades.
2. Variables del tipo XML y WSDL.
3. Un modelo de lenguaje extensible de componentes para permitir escribir expresiones y consultas (queries) en múltiples lenguajes: BPEL soporta Xpath 1.0 predeterminadamente.
4. Construcciones de programación estructurada incluyendo "if-then-elseif-else", "while", "sequence" (posibilita la ejecución de comandos en orden) y "flow" (posibilita la ejecución de comandos en paralelo).
5. Un sistema de ámbito (scoping) que permite el encapsulamiento de lógica con variables locales, manejadores de fallo, manejadores de compensación y manejadores de eventos.
6. Ámbitos serializados para controlar los accesos a las variables.
 
Imagen que representa la función de orquestación de BPEL
 

¿Cuáles son los objetivos del diseño BPEL?
1. Definir procesos de negocio que interactúan con entidades externas mediante operaciones de un servicio Web definidas usando WSDL 1.1 y que se manifiestan a sí mismas como servicios Web.
2. Definir procesos de negocio utilizando un lenguaje basado en XML. No definir una interpretación gráfica de procesos o proveer de una metodología de diseño en particular.
3. Definir una serie de conceptos de orquestación de servicios Web que pretenden ser usados por vistas internas o externas de un proceso de negocio.
4. Proveer funciones de manipulación simple de datos, requeridas para definir datos de procesos y flujos de control.
5. Usar servicios Web como modelo para la descomposición y ensamblaje de procesos.
6. Construir sobre estándares de servicios Web (aprobados y propuestos) tanto como sea posible, de manera modular y extensible.

Imagen que representa la relación secuencial entre BPMN y BPEL

Referencia
 
 
¿Y que hay con PeopleSoft? ¿Cómo implemento BPEL?
 
PeopleSoft, siempre a la vanguardia en cuanto a tecnologías de integración basadas en servicios, posee una funcionalidad que le permite la integración con servicios basados en procesos BPEL.
 
En líneas generales, PeopleSoft nos permite consumir y proveer procesos BPEL en base a clases de aplicación, hechas en su lenguaje de programación propietario: PeopleCode, que ejecutan y controlan instancias de procesos BPEL.
 
Para la integración de Procesos BPEL con PeopleSoft se puede emplear cualquier tipo de motor de ejecución BPEL. El motor de ejecución que PeopleSoft recomienda, y el que se encuentra como referencia en su documentación técnica acerca de este punto, es el Oracle BPEL Process Manager.
 
¿Posee PeopleSoft, en su lenguaje de programación propietario PeopleCode, algunas clases (API's, o frameworks) que me permitan interactuar, sin programar tanto, con los procesos BPEL?
Si. PeopleCode es un lenguaje de programación orientado a objetos; por ello, y como parte de una de sus API's, podemos encontrar la Clase BPEL, la cual posee métodos públicos ya definidos que nos permiten interactuar fácilmente con los procesos BPEL.
 
¿Y cómo se realiza la conectividad entre PeopleSoft y el Motor de Ejecución BPEL?
PeopleSoft entrega un nodo llamado BPEL, el cual es usado EXCLUSIVAMENTE para integraciones BPEL siempre y cuando esté trabajando con el motor de ejecución Oracle BPEL Process Manager. Para el resto de motores de ejecución BPEL, deberá crear y configurar un nuevo nodo (en PeopleSoft, un nodo se puede configurar de diferentes maneras: HTTP, HTTPS, FTP, SMTP, etc.).
 
IMPORTANTE: Los nodos representan cualquier organización, aplicación o sistema que va a desempeñar un papel en las integraciones con PeopleSoft.
 
Consumir Servicios basados en Procesos BPEL
Para poder consumir servicios basados en procesos BPEL desde PeopleSoft se debe tener en cuenta los siguientes puntos:
  • Despliegue del Proceso BPEL: En primer lugar, el motor de ejecución BPEL debe haber desplegado su proceso BPEL de modo tal que, se genere un documento WSDL.
  • Importar los documentos WSDL desde los procesos BPEL: PeopleSoft puede consumir los documentos WSDL desde un repositorio UDDI, URL WSDL, URL WSIL o mediante un archivo.
  • Consumir operaciones BPEL síncronas: En PeopleSoft se puede crear peticiones BPEL síncronas, invocar operaciones BPEL síncronas y procesar respuestas BPEL síncronas.
  • Consumir operaciones BPEL de petición/respuesta asíncronas: En PeopleSoft se puede crear peticiones BPEL de petición/respuesta asíncronas, invocar operaciones BPEL de petición/respuesta asíncrona, crear un controlador para procesar la respuesta de una petición/respuesta BPEL asíncrona y añadir un controlador a una operación de servicio para procesar una respuesta BPEL de petición/respuesta asíncrona.
  • Consumir operaciones BPEL one-way asíncronas: En PeopleSoft se puede crear peticiones BPEL one-way asíncronas, invocar operaciones one-way asíncronas y añadir controladores para asignar ID's consecutivos a todas estas peticiones.

Proveer Servicios PeopleSoft a Procesos BPEL
Para poder proveer servicios PeopleSoft a procesos BPE se debe tener en cuenta los siguientes puntos:
  • Proveer operaciones síncronas PeopleSoft a Procesos BPEL: Se debe construir servicios PeopleSoft síncronos, proveer servicios PeopleSoft síncronos como documentos WSDL y consumir el servicio en un proceso BPEL e invocar dicho proceso.
  • Proveer operaciones petición/respuesta asíncronas PeopleSoft a Procesos BPEL: Se debe construir servicios PeopleSoft de petición/respuesta asíncronas, proveer servicios PeopleSoft de petición/respuesta asíncrona como documentos WSDL y consumir el servicio en un proceso BPEL e invocar dicho proceso.
 
¿Cómo implemento esta integración en la vida real?
Lo que describimos anteriormente fue, en líneas generales, la manera como se debe implementar una integración PeopleSoft - Motor de Ejecución de Procesos BPEL. Para encontrar esta implementación a detalle puede tomar como referencia el siguiente apartado (para no perder la costumbre... 100% libre, sin costo y propiedad de Oracle):
 
 
Espero haber contribuido a ampliar un poco más su conocimiento acerca de esta tecnología de integración que día a día gana más adeptos en el mercado.
 
Saludos
 
AAM

jueves, 10 de octubre de 2013

Especificación WS-Security, ¿por qué nadie profundizó este tema? Nuevamente... PeopleSoft come to me!!!

¿Qué es WS-Security?
(Seguridad en Servicios Web) es un protocolo de comunicaciones que suministra un medio para aplicar seguridad a los Servicios Web. En abril de 2004 el estándar WS-Security 1.0 fue publicado por Oasis-Open. En 2006 fue publicada la versión 1.1.
 
Historia
Originalmente desarrollado por IBM, Microsoft, y VeriSign, el protocolo es ahora llamado oficialmente WSS y está desarrollado por un comité en Oasis-Open.
 
Contenido
El protocolo contiene especificaciones sobre cómo debe garantizarse la integridad y seguridad en mensajería de Servicios Web. El protocolo WSS incluye detalles en el uso de SAML (Lenguaje de Marcado para Confirmaciones de Seguridad) y Kerberos (Protocolo de Autenticación de Redes de Ordenador), y formatos de certificado tales como X.509 (en criptografía, es un estándar UIT-T para infraestructuras de claves públicas).
 
Método Alternativo al WSS
La Integridad de datos y confidencialidad podrían también garantizarse sobre Servicios Web a través del uso de la Transport Layer Security (TLS), por ejemplo enviando mensajes sobre HTTPS. Esto puede reducir significativamente la sobrecarga, por ejemplo eliminando la necesidad de codificar claves y firmas de mensaje en ASCII antes de enviar. La parte negativa de usar TLS sería si los mensajes necesitaran pasar a través de un servidor proxy, como si fuera necesario ver la petición para enrutado. En tal caso, el servidor vería la petición que llega del proxy, no del cliente; esto podría ser solventado si el proxy tiene una copia de la clave y certificado del cliente, o teniendo un certificado de firmado de confianza para el servidor, con el cual podría generar un par clave/certificado que coincida con aquellos del cliente. Sin embargo, el hecho de que el proxy está operando el mensaje significa que no asegura la seguridad extremo a extremo, sino que solo asegura la seguridad punto a punto.
 
¿Dónde se implementa?
WS-Security incorpora características de seguridad en el encabezado de un mensaje SOAP, trabajando en la capa aplicación. Así asegura seguridad extremo a extremo.
 
 
 
Fuentes
 
Y a todo esto... ¿Cómo lo implementa PeopleSoft?
 
PeopleSoft WS-Security para WSRP
Empezaremos definiendo: ¿Qué es WSRP? Es un protocolo estándar aprobado por OASIS diseñado para la comunicación con portlets remotos.
 
WSRP implica pasar los mensajes SOAP entre el consumidor y el productor WSRP. Para usar WSRP sin peligro, Oracle proporciona seguridad a nivel de mensajes entre el consumidor y el productor mediante la incorporación de WS-Security.
 
WS-Security es una extensión del concepto SOAP envelope header que permite a las aplicaciones construir el intercambio de mensajes SOAP de forma segura. También proporciona un medio para asociar los tokens de seguridad con los mensajes.
 
WS-Security proporciona tres mecanismos principales:
 
1. La solución de integración entre el consumidor y el productor WSRP: El consumidor pasa su identificación al productor como parte del mensaje SOAP para que el productor pueda verificar la identidad y producir contenidos WSRP sin requerir que el usuario inicie sesión.
 
2. Integridad del mensaje: Asegura que los mensajes no han sido manipulados.
 
3. Confidencialidad Mensaje: Garantiza que los mensajes estén protegidos.
 
El siguiente diagrama muestra el sobre SOAP, el encabezado SOAP, y el cuerpo SOAP y la forma en que WS-Security incorpora el token de seguridad en los mensajes SOAP:
 
 
Cuando el portal de PeopleSoft es un consumidor WSRP, el ID Usuario y la Contraseña del usuario logueado en el portal se coloca en un Username o Token SAML en el encabezado SOAP, y el portlet WSRP lo consume. Este es presentado a cada portlet durante la petición de marcado inicial. El controlador de seguridad realiza la generación de un token WS-Security, la generación de la firma digital, y el cifrado del token antes de que PeopleSoft envíe el mensaje de petición SOAP y la cabecera SOAP WS-Security.
 
¡Importante! La información de autenticación al portal de PeopleSoft (tanto el ID de usuario como la contraseña) debe ser el mismo que el de los productores.
 
El portal acepta el token de nombre de usuario en el encabezado WS-Security desde el portal remoto, suponiendo que el ID y la contraseña son aceptados por el sistema PeopleSoft. El controlador de seguridad receptor descifra el encabezado SOAP, valida la firma digital, verifica el token WS-Security, y genera una cookie PS_TOKEN, el token de autenticación PeopleSoft.
 
El siguiente diagrama muestra el portal de PeopleSoft como consumidor WSRP and como productor WSRP:
 
 
El soporte WS-Security proporcionado para aplicaciones PeopleSoft incluyen:
 
1. Perfil de Token Username
2. Perfil de Token SAML (Lenguaje de Marcado para Confirmaciones de Seguridad)
 
NOTA: Las aplicaciones PeopleSoft soportan SAML 1.1.
 
Seguridad UserName Token
Con el soporte del token Username, un consumidor puede suministrar un UsernameToken como un medio de identificación del solicitante por nombre de usuario, y, opcionalmente usando una contraseña para autenticar su identidad en un proveedor de servicios web.
 
Este es un ejemplo XML de un Token UserName con password:
 
 
Al igual que la primera entrada que realicé, el objetivo no es explicar paso a paso como implementar la especificación WS-Security en los servicios PeopleSoft basados en SOAP; por esta razón, adjunto unos links de documentación Oracle (100% gratuito en la web) que les permitirá lograr este propósito:
 
 
Espero que esta entrada haya contribuido al conocimiento que poseen acerca de la especificación WS-Security y su implementación mediante encabezados SOAP.
 
Saludos
 
AAM

miércoles, 9 de octubre de 2013

Servicios REST en otras tecnologías... PeopleSoft come to me!!!

Hola a todos, como lo comenté a manera resumida en el primer foro del curso... yo trabajo en una consultora que brinda servicios exclusivos de implementaciones del ERP Oracle PeopleSoft. En esta oportunidad, me parece interesante que pueda comentarles acerca de la manera como este ERP implementa Servicios REST puesto que, la UPC (nuestra alma mater) emplea como software ERP el tan mencionado PeopleSoft (y por ahí que podemos encontrar alguna oportunidad laboral a futuro que nos permita compensar las pensiones cada día mas elevadas de la universidad jajajajajajaja ¡¡¡es broma!!!).
 
Antes de comenzar... es importante que podamos responder una pregunta:
 
¿Qué es Oracle PeopleSoft, una Solución ERP o un Lenguaje de Programación?
Oracle PeopleSoft es un software ERP propiedad de Oracle Corp. que permite planificar los recursos de entornos empresariales de mediana y gran escala. Entre las suites (módulos) más importantes que posee tenemos: HCM (Administración del Capital Humano), FSCM (Finanzas, Gestión Comercial y Cadena de Distribución), CRM (Administración de la Relación con el Cliente), Campus Solutions (Soluciones para Campus Universitarios), entre otros. A diferencia de otras soluciones ERP, PeopleSoft posee un Lenguaje de Programación propietario llamado PeopleCode y un entorno de desarrollo llamado Application Designer. Estas dos herramientas están orientadas a objetos y le permiten a los desarrolladores PeopleSoft no solo crear nuevas aplicaciones montadas sobre el ERP existente; sino también, desarrollar Servicios que se comuniquen con sistemas de terceros mediante RPC (WS-SOAP), REST (Servicios REST) e incluso implementando integraciones con Servicios Basados en Procesos BPEL (como lo leen!!! esta funcionalidad es nueva, y la verdad es que yo también me enteré hace poco que la nueva versión de las tools de PeopleSoft -8.53- ya incluye este tipo de implementación de servicios).
 
¿Cómo se implementa un Servicio REST en PeopleSoft?
El objetivo no es explicar paso a paso como lograrlo porque, se parte de la premisa de que pocas personas trabajan con esta solución ERP (y como dijimos líneas arriba, lenguaje de programación). Mi intención es que queden claro algunos conceptos:
 
1. La creación de un Servicio REST en PeopleSoft es lo mismo que crear un Servicio WCF en .NET (algo así como el Contrato de Servicio o [ServiceContract]).

 
2. La creación de una Operación de Servicio REST en PeopleSoft es lo mismo que crear los contratos de servicio dentro de la interface, y su posterior implementación en la clase del servicio propiamente dicho, en .NET (algo así como el Contrato de Operación o [OperationContract]).


A continuación un ejemplo completo de una Operación de Servicio REST en Oracle PeopleSoft:

 
3. Al igual que un Servicio REST en .NET, PeopleSoft también maneja los métodos HTTP para manipular los recursos definidos en la Operación de Servicio REST.
 
 
Los métodos HTTP son los mismos que ya hemos visto en la clase de Servicios REST, la única diferencia que he encontrado es el hecho de que se implementa un método HTTP adicional llamado HEAD (con esto no digo que en .NET no se implemente el método HEAD). Este método es idéntico al método GET excepto que el cuerpo del mensaje no es retornado en la respuesta.
 
Como bien dije al inicio, esta entrada no tendrá una explicación detallada (paso a paso) de como se implementa un Servicio REST en PeopleSoft, pero si les daré los enlaces directos (100% libres de costos y disponibles en la web de documentación de Oracle) que les permita lograr este propósito:
 
 
Espero que esta entrada haya contribuido al conocimiento que poseen acerca de la implementación de Servicios REST en tecnologías propietarias.

Saludos

AAM