Mostrando entradas con la etiqueta WSDL. Mostrar todas las entradas
Mostrando entradas con la etiqueta WSDL. Mostrar todas las entradas

viernes, 15 de enero de 2016

SEGMENTACIÓN EN DISEÑO DE .WSDL


Todos sabemos que la importancia que tiene en el ciclo de vida SOA la interface .WSDL, esto debido a que es el 'Description Language' de los Web Service y porque es el punto de acceso expuesto para la comunicación entre todos los servicio de tipo Web Service.

Debido a ello, es importante que durante la etapa de diseño uno se dé el tiempo debido en diseñar un correcto archivo .WSDL, de preferencia ya sea por medio de una herramienta o si se tiene práctica a mano, pero definir un buen diseño, considerando el posterior Topdown que se realizará.

En esta oportunidad mostraré como crear un .WSDL basado en un diseño segmentado "no común", pero altamente recomendado en los escenarios en que se requiere definir un .WSDL con gran cantidad de capacidades (operaciones) dentro de este.

Los modelos clásicos para diseñar un .WSDL (v1.1) son los siguientes:

 _ Un solo archivo .WSDL que contenga todo en su interior: (types (complexType, simplexTypes), message, portType, binding, service).  

_ Un archivo .WSDL que contenga en su interior: (message, portType, binding, service) y un archivo .XSD que contenga en su interior: (types (complexType, simplexTypes) ). El .WSDL import ó include el .XSD.  

_ Un archivo .WSDL que contenga en su interior:  (message, portType, binding, service), un archivo .XSD que contenga en su interior el modelo de datos propio de todas las operaciones: (types (complexType) ), un archivo .XSD que contenga datos 'genéricos' entre todas las operaciones. (types (complexType, simplexTypes) ). El .WSDL import ó include el .XSD propio y este import el .XSD genérico. 

Estos modelos de diseño de .WSDL son los conocidos y según el orden van mejorando el diseño propiamente. Así mismo, existe un modelo aún mejor pero que no es tan aplicado, este modelo de diseño se basa en segmentar la interface .WSDL de las operaciones en sí, haciendo que cada operación maneje su propio .WSDL y que exista un .WSDL principal. En otras palabras el diseño sería de esta manera:

_ Un archivo .WSDL (principal) que contenga en su interior:  (portType, binding, service), varios archivos .WSDL (según el número de operaciones existente) que contenga en su interior:  (message y types (complexType) propios de la operación), un archivo .XSD que contenga datos 'genéricos' entre todas las operaciones. (types (complexType, simplexTypes) ).  El .WSDL principal import todos los .WSDLs según el número de operaciones existentes y cada uno de estos .WSDL secundarios import  el .XSD genérico.

La ventaja de este modelo de diseño de .WSDL, es que está enfocado en las operaciones y hará al momento del Topdown respectivo que las clases .java (por ejemplo), se autogeneren en directorios independientes por cada operación respectivamente. Esto hará que no exista riesgo en el problema clásico de la duplicidad de clases usadas por cada operación al momento del Topdown:


La relación entre archivos es a nivel de NameSpace, debido a ello es bueno que se defina un correcto estándar en lo relacionado a los nombres, ya que en base a esta definición, se creará el orden de los directorios luego del Topdown respectivamente. Así mismo, todo lo demás es un juego de imports entre los archivos definidos:

- Archivo .WSDL (principal):


- Archivo .WSDL secundario por operación (Operación#1):


- Archivo .WSDL secundario por operación (Operación#2):


- Archivo .XSD genérica


Para los interesados en utilizar este tipo de modelo de diseño de .WSDL, pueden descargarlo desde aquí: http://www.mediafire.com/download/8nl9nuv6tmnpqr9/DisenioSegmentado_Wsdl.zip





domingo, 15 de noviembre de 2015

WSDL 1.1 vs WSDL 2.0


Desde el 2007 la (W3C), como consorcio internacional para el desarrollo de estándares Web, publicó lo que se conoce como el futuro y mejorado estándar para servicios, el estándar WSDL 2.0.

Esta versión nueva de WSDL 2.0 maneja varias diferencias y mejoras con relación a su antecesora y aún estándar WSDL 1.1, que son las siguientes:
  • El WSDL 2.0 integra el elemento Message dentro del elemento Types, con relación al WSDL 1.1
  • El WSDL 2.0 renombra el elemento PortType como Interface, con relación al WSDL 1.1
  • El WSDL 2.0 renombra el elemento Port a Endpoint, con relación al WSDL 1.1
  • El WSDL 2.0 renombra lo parte inicial de declaración en la interface conocida como Definitions como Description, con relación al WSDL 1.1
 

 

El modelo WSDL 2.0 también impone restricciones semánticas más allá de la conformidad estructural. Con el fin de describir con precisión estas limitaciones, y como ayuda para definir con precisión el significado de cada documento WSDL 2.0, la especificación WSDL 2.0 define un modelo de componentes como una capa adicional de abstracción por encima del conjunto de información XML. El siguiente diagrama ofrece una visión de los componentes de WSDL 2.0 y su herencia.


Esta nueva estructura del modelo WSDL es más amigable, mejor diseñada y entendible. Así mismo, lo resaltante de esta versión de WSDL 2.0 es que permite a los desarrolladores elegir el modelo de desarrollo de aplicaciones de Servicios: HTTP o SOAP. Esto debido a la creciente popularidad del modelo REST y SOAP.Con respecto al HTTP, se reconoció la clara necesidad de la compatibilidad con HTTP en las descripciones de aplicaciones Web (contratos). Por tanto, el WSDL 2.0 ofrece una compatibilidad absoluta con HTTP y SOAP, lo que lo hace muy útil tanto para aplicaciones Web sencillas, como para aplicaciones de Servicios Web que requieran de funcionalidades adicionales.

Lo desagradable es que actualmente hasta la fecha, esta versión de WSDL 2.0, no se ha vuelto aún estándar, debido a ello herramientas muy conocimiento como lo son: SOAPUI, ORACLE, IBM y apis como JAXWS aún NO lo soportan, teniendo conocimiento que el único que si lo soportar es AXIS2. Esto quiere decir que seguiremos usando como estándar para nuestros desarrollos el WSDL 1.1 por algo más de tiempo.Finalmente, los que desee actualmente existe un conversor de WSDL 1.1 a WSDL 2.0 (http://www.w3.org/2006/02/WSDLConvert.html), para que se alguna manera, para los que no se acostumbran aún, de esta manera les sea más fácil la transición al nuevo futuro estándar.


domingo, 9 de agosto de 2015

CAMPOS DINÁMICOS EN 'WSDL / XSD'

Durante los desarrollos de servicios tipo Web Service, los que estamos en el ambiente de desarrollos relacionados a EAI / SOA principalmente, sabemos que para el manejo de los Web Service propiamente, como buena práctica, es estándar el diseñar los contratos de servicios (WSDL) para poder en base a ellos, realizar los Top-down respectivos y en base a estos generar las clases necesarias para poder realizar los implementaciones de los servicios propiamente.

En esta oportunidad mostraré una forma de cómo, al momento de diseñar la interface WSDL, los parámetros que se manejan tanto en el Request / Response, se puede manejar dinámicamente. En si cuando hablamos de dinamismo quiero decir que por ejemplo al momento de crear los parámetros tanto para el Request / Response, normalmente estos son diseñados basados en types: (xsd:string, xsd:int, etc) de la siguiente forma:


Ahora al ser diseñado de esta manera la cantidad de campos enviados serán siempre de un tamaño fijo y ante cualquier campo adicional que se desee agregar, se necesitará alterar la Interface WSDL (esto impactará en la generación de otro Top-down, tanto para el server como para el cliente proxy).

Una solución para evitar este problema es el diseño dinámico en los 'xsd:Type'. Esta idea también es diseñada dentro de un 'xsd:complexType' y 'xsd:element', pero la idea no es tener comúnmente una cantidad de campos fija, sino tener un objeto o lista de campos definidos como: ‘Campo/Valor’ de la siguiente manera:


De esta manera los Top-down brindará fácilmente enviar la cantidad deseada tanto en el Request como Response deseado y dentro de la implementación, dependiendo del lenguaje deseado por ejemplo en JAVA simplemente se deberá antes que nada iterar un FOR combinándolo con un IF para comparar y obtener los campos deseados independientemente de la cantidad de campos que se desee. Vale la pena indicar que de este modo, una vez implementado previamente el Web Service, ya no será necesario realizar algún tipo de cambio tanto en el server como en el cliente proxy respectivamente.

Espero que la información les haya servido



jueves, 17 de mayo de 2012

GENERADOR DE OBJETOS JAVA DESDE WSDL [MAVEN]


Hola chicos en esta oportunidad postearé, sobre un utilitario que manejo para el manejo de WebService. Todos sabrán que ahora el manejo de los Servicios Web esta muy de moda, sobre todo como una fuerte modalidad de INTEGRACION de sistemas legacy con otros tipos de sistemas, en IDEs de INTEGRACION como IBM Websphere Message Broker o el OSB de ORACLE. La cuestión es que en el mercado existen muchos Frameworks para la generación de WebService y Proxys (Clientes WS) tales como: AXIS, AXIS2, JAXRPC, JAXWS, uno mas antiguos que otros y otros mejores que otros. Por motivos de trabajo he tenido la necesidad que trabajar con todos y los conozco bien pero particularmente prefiero por motivos de mejor generación de objetos, mantenibilidad, etc JAXWS.

Una cosa que no me gusta es que por ejemplo las IDES como ECLIPSE, JDEVELOPER, etc no tienen el soporte a todas estos Frameworks y constantemente uno tiene que bajar un plugin o sino manejar varias herramientas por ejemplo ECLIPSE soporta WS embebido con AXIS solamente y si quiero trabajar con JAXWS me tengo que apoyar en por ejemplo el WID de IBM que lo tiene embebido y si quiero AXIS2 bajarme un plugin adicional. Algo similar pasa con JDeveloper. Por otro lado, el manejo de Wizards como que nunca me gusto mucho así que para mi la modalidad compartida a continuación es la mas optima.

Lo que manejo es un proyecto de tipo MAVEN, que solo lo utilizo como Generador de Objetos y clases JAVA en base al WSDL (en FISICO o URL) respectivamente. Esto lo hago mediante Plugins de MAVEN para cada tipo diferente de FRAMEWORK.

ESCENARIO #1:  "Tengo un WSDL y requiero hacer un WS o un PROXY". Que necesito GENERAR el WS o el PROXY (Independientemente de lo que necesite) en base al WSDL (esto es lo mejor osea tener ya creado el WSDL).

SOLUCION #1: Apoyarnos en una o varias IDEs dependiendo de que Framework querer usar y realizar dicha generación.
SOLUCION #2: Bajarnos los comprimidos de cada Framework, mapearlos en variables de entorno y ejecutar los comandos respectivos por tipo de Framework desde consola.
SOLUCION #3: Trabajar con la solución  planteada  WSDL_MavenGenerator_JaxWs_Axis1_Axis2.zip. Ya que solo requiere 2 cosas: Que tengas tu MAVEN configurado y cambiar el plugin del POM.xml en base al framework deseado, de donde de: resources/IMPORTANTE.txt y listo se genera el paquete de clases y objetos requeridos para que los cortes y lo lleves a tu proyecto JAVA donde trabajaras. Ya no necesitaras varias IDES ni nada en un PROYECTO MAVEN lo tienes todo para generar con: AXIS, AXIS2 y JAXWS.

Aqui les comparto los PLUGINs manejados (Por Motivos del BLOG, he cambiado los simbolos de MAYOR / MEJOR por corchetes):

  
     //------------------------------------------------------------------------//
     //----------------------- PLUGIN: JAXWS -----------------------//
     //------------------------------------------------------------------------//

     [!-- GENERACION DE CLASES .JAVA (JAXWS), EN BASE AL [.WSDL] --]
     [plugin]
        [groupId]:[/groupId]
        [artifactId]jaxws-maven-plugin[/artifactId]
        [executions]
           [execution]
              [goals]
                 [goal]wsimport[/goal]
              [/goals]
           [/execution]
        [/executions]
        [configuration]
           [!-- ASIGNACION DE [PAQUETE] DE CLASES GENERADAS --]
           [packageName]pe.com.javaman.dummy.jaxws[/packageName]
           [wsdlDirectory]src/main/webapp/wsdl[/wsdlDirectory]
           [sourceDestDir]src/main/java[/sourceDestDir]
           [!-- keep=true: MAVEN mantiene FUENTES. keep=false: MAVEN regenera FUENTES. --]
           [keep]false[/keep]
           [verbose]true[/verbose]
        [/configuration]
     [/plugin]
   
   
     [!-- GENERACION DE CLASES .JAVA (MAPPING JAXWS), EN BASE A LA [URL]  --]
     [plugin]
        [groupId]org.codehaus.mojo[/groupId]
        [artifactId]jaxws-maven-plugin[/artifactId]
        [executions]
            [execution]
                [goals]
                   [goal]wsimport[/goal]
                [/goals]
                [configuration]
                    [!-- ASIGNACION DE [PAQUETE] DE CLASES GENERADAS --]
                    [packageName]pe.com.javaman.dummy.jaxws[/packageName]
                    [wsdlUrls]
                      [wsdlUrl]http://localhost:8090/GestionDatosUsuarioWS/GestionDatosUsuarioWSService?wsdl[/wsdlUrl]
                    [/wsdlUrls]
                    [sourceDestDir]src/main/java[/sourceDestDir]
                    [!-- keep=true: MAVEN mantiene FUENTES. keep=false: MAVEN regenera FUENTES. --]
                    [keep]false[/keep]
                    [verbose]true[/verbose]
                [/configuration]
            [/execution]
        [/executions]
     [/plugin]

     //----------------------------------------------------------------------//
     //----------------------- PLUGIN: AXIS1 -----------------------//
     //----------------------------------------------------------------------//

     [!-- GENERACION DE CLASES .JAVA (AXIS1), EN BASE AL [.WSDL] --]
     [plugin]
        [groupId]org.codehaus.mojo[/groupId]
        [artifactId]axistools-maven-plugin[/artifactId]
        [version]1.4[/version]
        [executions]
          [execution]
            [goals]
              [goal]wsdl2java[/goal]
            [/goals]
          [/execution]
        [/executions]
        [configuration]
           [!-- ASIGNACION DE [PAQUETE] DE CLASES GENERADAS --]
           [packageSpace]pe.com.javaman.dummy.axis1[/packageSpace]
           [sourceDirectory]src/main/webapp/wsdl/[/sourceDirectory]
           [outputDirectory]src/main/java[/outputDirectory]
           [helperGen]true[/helperGen]
           [verbose]true[/verbose]
        [/configuration]
     [/plugin]
   
     [!-- GENERACION DE CLASES .JAVA (AXIS1), EN BASE AL [.URL] --]
     [plugin]
        [groupId]org.codehaus.mojo[/groupId]
        [artifactId]axistools-maven-plugin[/artifactId]
        [version]1.4[/version]
        [executions]
          [execution]
            [goals]
              [goal]wsdl2java[/goal]
            [/goals]
          [/execution]
        [/executions]
        [configuration]
           [!-- ASIGNACION DE [PAQUETE] DE CLASES GENERADAS --]
           [packageSpace]pe.com.javaman.dummy.axis1[/packageSpace]       
           [urls]
             [url]http://localhost:8090/GestionDatosUsuarioWS/GestionDatosUsuarioWSService?wsdl[/url]
           [/urls]
           [outputDirectory]src/main/java[/outputDirectory]
           [helperGen]true[/helperGen]
           [verbose]true[/verbose]
        [/configuration]
     [/plugin]

     //-----------------------------------------------------------------------//
     //----------------------- PLUGIN: AXIS2 -----------------------//
     //----------------------------------------------------------------------//
   
     [!-- GENERACION DE CLASES .JAVA (AXIS2), EN BASE AL [.WSDL] --]
     [plugin]
        [groupId]org.apache.axis2[/groupId]
        [artifactId]axis2-wsdl2code-maven-plugin[/artifactId]
        [version]1.5.4[/version]
        [executions]
            [execution]
                [goals]
                    [goal]wsdl2code[/goal]
                [/goals]
            [/execution]
        [/executions]
        [configuration]
            [!-- ASIGNACION DE [PAQUETE] DE CLASES GENERADAS --]
            [packageName]pe.com.javaman.generate.axis2[/packageName]
            [wsdlFile]src/main/webapp/wsdl/GestionDatosUsuarioWSService.wsdl[/wsdlFile]
            [outputDirectory]src/main/[/outputDirectory]
            [targetSourceFolderLocation]java[/targetSourceFolderLocation]
            [databindingName]xmlbeans[/databindingName] 
            [unpackClasses]true[/unpackClasses]
            [verbose]true[/verbose]     
            [options]
               [uwc]true[/uwc]
            [/options]        
        [/configuration]          
     [/plugin]

     [!-- GENERACION DE CLASES .JAVA (AXIS2), EN BASE AL [.URL] --]
     [plugin]
        [groupId]org.apache.axis2[/groupId]
        [artifactId]axis2-wsdl2code-maven-plugin[/artifactId]
        [version]1.5.4[/version]
        [executions]
            [execution]
                [goals]
                    [goal]wsdl2code[/goal]
                [/goals]
            [/execution]
        [/executions]
        [configuration]
            [!-- ASIGNACION DE [PAQUETE] DE CLASES GENERADAS --]
            [packageName]pe.com.javaman.generate.axis2[/packageName]
            [wsdlFile]http://localhost:8090/GestionDatosUsuarioWS/GestionDatosUsuarioWSService?wsdl[/wsdlFile]
            [outputDirectory]src/main/[/outputDirectory]
            [targetSourceFolderLocation]java[/targetSourceFolderLocation]
            [databindingName]xmlbeans[/databindingName] 
            [unpackClasses]true[/unpackClasses]
            [verbose]true[/verbose]     
            [options]
               [uwc]true[/uwc]
            [/options]        
        [/configuration]          
     [/plugin]


Para poder descargar el generador de WSDL pulsar: WSDL_MavenGenerator_JaxWs_Axis1_Axis2.zip


Saludos.