Mostrando entradas con la etiqueta Web Service. Mostrar todas las entradas
Mostrando entradas con la etiqueta Web Service. Mostrar todas las entradas

viernes, 14 de abril de 2017

SOLUCIÓN AL MAL ENTENDIMIENTO DE CONCEPTOS SOA


Buen día luego de un tiempo regreso a escribir un poco sobre un tema que considero importante y que hace unos días, conversando con algunos compañeros, he notado que persiste la problemática y/o desconocimiento de muchos conceptos que derivan de SOA.

Uno de ellos y el cual me enfocaré en esta oportunidad es sobre el problema que se tiene con los conceptos de: SERVICIO, WEBSERVICE, REST, APLICACIÓN. Mucho colegas ingenieros ya sean Consultores, Arquitectos, etc, utilizan estas definiciones muy por usar, aparentemente sin conocer la realidad de cada uno y a que está enfocado, y lo que hacen es por ejemplo para hablar de un SERVICIO, mencionan WEBSERVICE, o para hacer referencia a un WEBSERVICE de un tipo específico lo llaman como APLICACIÓN y eso está realmente mal. 

El objetivo de este artículo es justamente dar a conocer las diferencias entre estas definiciones, para que los que aún tienen problemas con dichos conceptos, sepan aplicarlos correctamente al explicar y/o graficar sus arquitecturas a futuro.

A continuación detallaré con mis propias palabras, el concepto utilizado a nivel de TELCOS y en realidad el estándar que debería ser utilizado en cualquier rubro respectivamente:

APLICACIÓN:
Una Aplicación se hace referencia al software que interactúa con el usuario por medio una interface gráfica (el Front-end), está puede estar construida en cualquier lenguaje de programación como JAVA o .NET (últimamente: Angular JS + Bootstrap). En una Arquitectura SOA las Aplicaciones son las encargadas de interactuar por medio de la ejecución de sus componentes HTML (Links, Botones, etc), con un 'inventario de servicios' expuestos por detrás.

SERVICIO:
Un Servicio debe ser considerado como un 'activo de la empresa' y puede ser considerado como Servicio  a nivel de tecnología por ejemplo: un WebService, un EJB, un MDB, etc. El objetivo es que cumplan el objetivo para los que fueron construidos y así mismo sigan sobre todo los principios SOA. Finalmente, es importante saber que un Servicio en base a su tipo (muy independientemente del lenguaje en que se desarrolle: JAVA, BPEL) pueden ser de tipo:
  • Presentación: Servicios que dan la cara a la aplicación (No tienen lógica de negocio), redireccionan.
  • Negocio:  Servicios que orquestan a nivel de sus flujos, la lógica de negocio definida para el proceso.
  • Utilitario: Servicios que su objetivo es la reutilización, para el acceso a BackEnd y/o funcionalidades por ejemplo: BD, Plataformas Legacy, Envío de correos, Generación de logs, etc (No tienen lógica de negocio), aquí entran a tallar como parte de este tipo los conceptos de servicios de: ''Conectividad' y 'Datos'. 
WEBSERVICE:
Un Webservice es un tipo de Servicio, pero que cumple los protocolos como: SOAP & REST. Si hablamos del primer protocolo estos pueden manejar: SOAP 1.1 o SOAP 1.2 y manejar su comunicación tipo: Síncrono, Asíncrono y Oneway (XML en realidad). Así mismo, el segundo protocolo puede manejar una comunicación basada en XML & JSON (Formatos distintos) y si cumple en su manejo con las operaciones estándar: GET, POST, DELETE, etc, se le conoce como RESTfull.


De esta manera se ha tratado de explicar de la manera más amigable los diferentes conceptos SOA que usualmente generan controversia en su entendimiento.



domingo, 20 de marzo de 2016

APACHE JMETER (Enfoque WS)

Un tema muy importante durante los proyectos de tipo SOA, son las pruebas unitarias que se le hagan durante las construcción de los servicios. Aquí se podrá verificar que tal fluye la lógica de negocio  plasmada y como la arquitectura definida del servicio es tan robusta como para poder distribuir bien, rápida y correctamente la información. Así mismo, en muchas de estas pruebas es muy importante medir resultados lo que se conoce como tps (transacciones por segundo), entre otros resultados estadísticos, que son necesario ya que al tenerlos uno podrá validar que la velocidad y el rendimiento del servicio son los ideales. Aquí nace la necesidad de una herramienta que facilite dicha tarea de prueba.

Apache JMeter es un proyecto de Apache que puede ser utilizado como una herramienta de pruebas unitarias para analizar y medir el desempeño de servicios especialmente las de tipo aplicaciones web, así mismo soporta aserciones para asegurarse que los datos recibidos son correctos y brinda una variedad de reportes.


Con dicha herramienta se podrá obtener también automáticamente gráficas atractivas y significativas de nuestro resultado con las cuales se podrá analizar más rápidamente resultados de las pruebas e incluirlas el en un informe requerido. Además, se puede utilizar para realizar un análisis gráfico de rendimiento o para probar el comportamiento de respuesta del servidor bajo gran carga concurrente.

El siguiente tutorial mostrará justamente una parte de todo lo que esta herramienta brinda, que es el enfoque de como configurar y justamente cómo estresar un Servicio Web utilizando esta herramienta. Así mismo, se están cubriendo detalladarmente los siguientes puntos:

- Requerimientos.
- Instalación.
- Configuración y Prueba.


Para descargar este tutorial paso a paso ingresar aquí:
http://www.mediafire.com/download/03m0w2k8kefhiii/Tutorial+Apache_JMeter_v2.0.pdf

domingo, 21 de abril de 2013

CREACIÓN DE SERVICIO WEB CON ‘SERVICE CONTROL’ BASADO EN ‘JAX-RPC’

Hola en esta oportunidad brindaré el siguiente tutorial que mostrará el manejo de SERVICE CONTROLs relacionado a servicios Web con JAX-RPC, desplegados en Servidores de Aplicación Oracle WebLogic 10 y sobre una IDE “Oracle WorkShop  10.4 for Weblogic”.

El escenario a simular es el desarrollo de un WebService que internamente contendrá un flujo para completar la información requerida consumiendo dos servicios web de tipo Proxy.

Estos servicios Proxy son los siguientes y serán iniciados vía un Mock Services con SoapUI:

- http://localhost:8088/mockObtenerDatosBinding?wsdl
- http://localhost:8088/mockObtenerTecnologiaBinding?wsdl

PASOS
:


1. DESPLEGAR SERVICIOS EXTERNOS:

Iniciamos los Mock Services del SoapUI:

•    ObtenerDatosBinding_PROXY.wsdl   (WSDL)
•    obtenerDatos_lib.xsd  (XSD)
•    ObtenerTecnologiaBinding_PROXY.wsdl    (WSDL)
•    obtenerTecnologia_lib.xsd   (XSD)

Con los WS externos ya iniciados procedemos a crear el WS project.


2.  CREAR UN WEB SERVICE PROJECT EN WORKSHOP:

- Abrir la IDE: Oracle workshop for Web Logic.
- Hacer  clic derecho en el explorador de proyectos y seleccionar: 
File/New/Other/Web Service/WebService Project

- Ingresar el nombre del proyecto: DummyExceptionWS, luego en las de la pantalla seleccionar   ‘Annotated Web Service Facets JAX-RPC’  y haga click en el botón siguiente, siguiente y luego Finalizar.
- Vamos a Crear a WebService en modo: Top-Down (Teniendo el .WSDL ya creado), ya que es una buena práctica. Para ello sobre el .WSDL del damos:
click derecho/WebServices/Generate Web Service

Asignamos el nombre del paquete donde se creará la clase pública del  WS: pe.com.dummyException.ws

Se creará la clase:  ControlExceptionPortTypeImpl tendrá una interfaz GRÁFICA donde se mostraran los métodos de dicho WS.

Las librerías COMPARTIDAS (Shared), solo deberán apreciarse 2:  beehide-control y weblogic-controls

Así mismo dentro de:  DummyExceptionWS\WebContect\WEB-INF\lib, se creará un .jar que contendrá  las clases no públicas y no modificables del     WebService creado.


3.  CREANDO UN WEB SERVICE CONTROL:
 En el sourceFolder src creamos 2 paquetes:

 pe.com.dummyException.proxy 
(Dentro se ubicaran los .WSDL y .XSD de los proxy externos)   
 pe.com.dummyException.control  (Dentro de ubicaran los SERVICE CONTROL de cada proxy externo)
 Ahora ubicamos los .WSDL y .XSD de los PROXY externos dentro del paquete: pe.com.dummyException.proxy    

 En base a cada .wsdl de los WS externos, generamos las clases SERVICE CONTROL: Click derecho sobre el:  wsdl/WebService/Generate Service Control
- Asignamos los Types de tipo JAX-RPC:
- Se creará dentro de la carpeta .lib un .jar:
  ObtenerDatosBinding_PROXY_JAXRPC.jar


Dentro del sourceFolder: pe.com.dummyException.control, creamos la clase controladora:  ObtenerDatosControl.java


"Este paso hacerlo para cada WS Externo que se tenga".
       
 4. CREANDO LA CLASE HELPER:
Crearemos una clase Helper de ayuda que contendrá los setters y getters del objeto de control de servicios.

Para ello creamos un SourceFolder llamado:  pe.com.dummyException.helper

Las clases las llamaremos:
•    ObtenerDatosHelper
•    ObtenerTecnologiaHelper



5.  IMPLEMENTAR EL WEB SERVICE:
Con los WebService Externos (Proxy), ya mapeados, con sus Service Control y Hepers ya creados, procedemos a implementar el flujo del ServicioWeb:

Ingresamos a la clase: ControlExceptionPortTypeImpl.java y al método:  controlException y dentro ingresamos toda la lógica:


6.  DESPLEGAMOS EL WEB SERVICE:
- Generamos el .EAR llamado: DummyExceptionWS_EAR.ear
- Ingresamos a la CONSOLA ADMINISTRATICA Weblogic:

http://192.168.1.33:7001/console/login/LoginForm.jsp
-    USER:             weblogic
-    PASSWORD:  weblogic

Ingresamos en el árbol en: Deployments, pulsamos Instalar y buscamos la ruta del .EAR, luego Next:

- Pulsamos Next:
- Pulsamos Finish:
- Ingresamos dentro del .EAR y entramos al Web Service:
- Ingresamos a la pestaña:  Testing:

Mostramos la URL del WS creado es la siguiente:

http://192.168.1.33:7001/DummyExceptionWS/ControlExceptionPortTypeImpl?wsdl



7.    PROBAR EL WEB SERVICE DESPLEGADO:
       Ingresamos los dos datos requeridos y ejecutamos.

       Finalmente, mostramos los LOGs respectivos de los PROXYs consumidos:
--------------- DENTRO DEL MÉTODO: [controlException] - [INICIO] ---------------
vIdTransaccion: [5214952]
vTelefono: [41816133]
--------------- DENTRO DEL MÉTODO: [getObtenerTecnologiaPROXY] - [INICIO] ---------------
URL: [http://localhost:8088/mockObtenerTecnologiaBinding?wsdl]
TIMEOUT: [10000]
XML 'ObtenerTecnologia' [REQUEST]: [externalcompany.com.pe.bean.obtenertecnologiaws.ObtenerTecnologiaInput@ed301f]
XML 'ObtenerTecnologia' [RESPONSE]: [externalcompany.com.pe.bean.obtenertecnologiaws.ObtenerTecnologiaInput@ed301f]
--------------- DENTRO DEL MÉTODO: [getObtenerTecnologiaPROXY] - [FIN] ---------------

--------------- DENTRO DEL MÉTODO: [getObtenerDatosPROXY] - [INICIO] ---------------
URL: [http://localhost:8088/mockObtenerDatosBinding?wsdl]
TIMEOUT: [10000]
XML 'ObtenerDatos' [REQUEST]: [externalcompany.com.pe.bean.obtenerdatosws.ObtenerDatosInput@109efc2]
XML 'ObtenerDatos' [RESPONSE]: [externalcompany.com.pe.bean.obtenerdatosws.ObtenerDatosOutput@10aef1d]
--------------- DENTRO DEL MÉTODO: [getObtenerDatosPROXY] - [FIN] ---------------
--------------- DENTRO DEL MÉTODO: [controlException] - [FIN] ---------------


- Para descargar el tutorial completo paso a paso dar click: AQUÍ
- Para descargar las fuentes del dummy dar click: AQUÍ


sábado, 18 de agosto de 2012

CREACIÓN DE "WEBSERVICE" BASADO EN "JAXWS" DESDE "ECLIPSE"


En este tutorial se mostrará la creación de WebService apoyándose en el Framework JAXWS a modo TopDown (desde la Interface .wsdl) todo desde la ide “ECLIPSE”, específicamente usando: SpringSourceToolSuite v2.9.2, y como servidor de aplicaciones el: ORACLE WEBLOGIC Asumiremos que la interface .wsdl, ya se tiene creada.

Todo el tutorial en detalle se ha especificado en un documento word.

Para descargar el tutorial paso a paso, dar click: AQUI





APLICACIÓN DE "TIMEOUT" EN "PROXY CLIENT" CON "AXIS 1.4"

En esta oportunidad mostraré algo muy requerido y necesario cuando se consumen WebService, a lo que me refiero es a la aplicación de los famosos TIMEOUT control de cada WebService consumido por medio de lo "Proxy Client" generados.

En esta oportunidad mostraré el manejo de dicho TimeOut por medio del FrameWork AXIS 1.4, un FrameWork no tan power como JaxWS pero que buen y aun muy usado en el mercado mundial.

Aquí muestro el contenido completo de la clase JAVA: TestProxyAxis1 , en donde limplemento el Cliente que consume un supuesto WebService: http://localhost:7001/ObtenerTecnologiaWS/ObtenerTecnologiaService?wsdl, al cual se le envía un numero telefónico y este responde con el tipo de Tecnología (El WS no es parte de este ejemplo planteado). Se debe de suponer que previamente uno ya ha tenido que crear el "Proxy Client" (.jar), para poder consumir el Servicio Web.

EJEMPLO:

import java.net.SocketTimeoutException;
import java.net.URL;
import javax.xml.rpc.ServiceException;
import org.apache.axis.AxisFault;
import externalCompany.com.pe.bean.ObtenerTecnologiaRequest;
import externalCompany.com.pe.bean.ObtenerTecnologiaResponse;
import externalCompany.com.pe.bean.TransaccionBean;
import externalCompany.com.pe.bean.ObtenerTecnologiaWS.ObtenerTecnologiaBindingStub;
import externalCompany.com.pe.bean.ObtenerTecnologiaWS.ObtenerTecnologiaInput;
import externalCompany.com.pe.bean.ObtenerTecnologiaWS.ObtenerTecnologiaOutput;
import externalCompany.com.pe.bean.ObtenerTecnologiaWS.ObtenerTecnologiaServiceLocator;

/**
 * @author cguerra.
 * @clase: TestProxyAxis1.java 
 * @author_company: nombre de la compañía del autor.
 * @fecha_de_creación: dd-mm-yyyy.
 * @fecha_de_ultima_actualización: dd-mm-yyyy.
 * @versión 1.0
 */
 public class TestProxyAxis1{

   /**
    * @param argumentos
    */
    public static void main( String ... argumentos ){

        String URL_ENDPOINT = "http://localhost:7001/ObtenerTecnologiaWS/ObtenerTecnologiaService?wsdl";
       
        ObtenerTecnologiaServiceLocator objLocator = null;
        ObtenerTecnologiaBindingStub      objBinding = null;
       
        ObtenerTecnologiaInput          objInput    = null;
        ObtenerTecnologiaRequest    objRequest  = null;
        ObtenerTecnologiaOutput       objOutput   = null;
        ObtenerTecnologiaResponse objResponse = null;
       
        try{
            objLocator = new ObtenerTecnologiaServiceLocator();
            objBinding = (ObtenerTecnologiaBindingStub)objLocator.getObtenerTecnologiaPort( new URL( URL_ENDPOINT ) );
           
            //TIMEOUT:
            setTimeOutWS( objBinding );
           
            objInput          = new ObtenerTecnologiaInput();            
            objRequest    = new ObtenerTecnologiaRequest();   
            objOutput       = new ObtenerTecnologiaOutput();
            objResponse  = new ObtenerTecnologiaResponse();
                                   
            objInput.setParam_Request( objRequest );
                       
            //INPUT:
            objRequest.setTelefono( "52148652" );
            objInput.setParam_Request( objRequest );           
           
            //WEBSERVICE:
            objOutput      = objBinding.obtenerTecnologia( objInput );           
            objResponse = objOutput.getParam_Response();
           
            //OUTPUT:
            String          tecnologia       = objResponse.getTecnologia();
            TransaccionBean objTransaccionBean = objResponse.getTransaccionBean();
            String          codigo             = objTransaccionBean.getCodigo();
            String          mensaje          = objTransaccionBean.getMensaje();
           
            System.out.println( "- TECNOLOGIA: " + tecnologia );
            System.out.println( "- CODIGO:     " + codigo  );
            System.out.println( "- MENSAJE:    " + mensaje );
        }
        catch( ServiceException e ){
               System.out.println( "ERROR:[ServiceException] " + e );
        }
        catch( AxisFault e ){
               System.out.println( "ERROR:[AxisFault] " + e );
        }
        catch( Exception e ){
               System.out.println( "ERROR:[Exception] " + e );
        }
    }
   
   /**
    * setTimeOutWS   
    * @param  objBinding
    * @throws Exception
    */
    public static void setTimeOutWS( ObtenerTecnologiaBindingStub objBinding ) throws Exception{ 
       
        try{
            javax.xml.rpc.Stub          objStub_RPC  = (javax.xml.rpc.Stub)objBinding;        
            org.apache.axis.client.Stub  objStub_AXIS = (org.apache.axis.client.Stub)objBinding;
           
            int timeOut = (5 * 1000);  //5 segundos
            
            //----- FORMA #1: -----//
            objStub_RPC._setProperty( "axis.connection.timeout", timeOut );
           
            //----- FORMA #2: -----//
            objStub_AXIS.setTimeout( timeOut );
           
            //----- FORMA #3: -----//       
            objBinding._setProperty( org.apache.axis.client.Call.CONNECTION_TIMEOUT_PROPERTY, timeOut ); 
        }
        catch( Exception e ){
               throw new SocketTimeoutException();
        }       
    }
   
}

El método:  setTimeOutWS recibe solo el Binding y es reutilizado para desde cualquier lugar aplicar un TIMEOUT de 3 formas distintas (uno ya escoge cual de ellas usar).

Saludos.

domingo, 22 de abril de 2012

CREACION DE WEB SERVICE CON JAX-WS EN JDEVELOPER v11gR2

Hola en esta oportunidad mostrare un Dummy, que muestra sobe todo el manejo de la IDE JDeveloper para el desarrollo de WebService con soporte del Framework JAX-WS, en base a una Interfaz WSDL.

En Si JDeveloper como IDE de desarrollo con respecto a ECLIPSE que es mi herramienta por excelencia. Me deja muchas cosas que desear, ya que lo veo muy limitada, repetitiva y con mucho Wizard. Pero en fin mostrare como desarrollar dicho WebService y como deployarlo en un ORACLE WEBLOGIC SERVER 11gR1.

Antes que nada tenemos que tener nuestros WSDL con su XSD ya creado, porque generaremos la arquitectura del WebService en base a dicho WSDL.

Aquí el WSDL en el cual a modo de Dummy he puesto varias operaciones básicas y 2 operaciones orientadas a Objetos que responden un Objeto Usuario y una Lista de Usuarios:


Las Operaciones que soportara el WebService son las siguientes:

 - sumar
 - restar
 - multiplicar
- dividir
- consultarUsuario
- listarUsuario

Ahora pasaremos detallar todo el manejo en JDeveloper, pero para un mejor entendimiento (ya que son bastantes pasos), puedes descargar el TUTORIAL paso a paso completo: AQUI.

Para descargar las fuentes pulsar: AQUI.

domingo, 10 de octubre de 2010

MANEJO DE 'WEB SERVICE' CON 'JAX-WS'.

Que tal amigos después de un tiempo regreso para postear sobre este tema interesante relacionado a WebService. En esta oportunidad hablare sobre el Framework JAX-WS, este Framework en comparación de otros Frameworks, te facilita la generación WebService vía un simple Servlet y algo muy bueno es que permite a diferencia de otros Frameworks para WS, el manejo de colecciones (ArrayList, List, Vector) como INPUT & OUTPUT de cada una de las operaciones que se declaren en dichos WS.

Los pasos para poder levantar un WS vía JAX-WS son los siguientes:

- Descargar las fuentes Core del JAX-WS pulsando: AQUÌ..

- Ubicar las fuentes descomprimirlas y ubicarlas en la ruta: C:\JAVA\JAX-WS\JAXWS2.a.2.
- Crea la variable de entorno: JAXWS_HOME, que apunte a la ruta donde estaba las fuentes de JAX-WS descargadas: C:\JAVA\JAX-WS\JAXWS2.1.2\jaxws-ri
- Crea un Servlet similar a este:

package org.java.ws.servlet;

import static org.java.ws.util.Constantes.URL_WEBSERVICE;
import java.io.Serializable;
import javax.servlet.GenericServlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.java.ws.servidor.UsuarioDAOImpl;

/**
* @author cguerra.
* @clase: InicialiadorJAXServlet.java
* @descripción descripción de la clase.
* @author_web: http://frameworksjava2008.blogspot.com
http://viviendoconjavaynomoririntentandolo.blogspot.com
* @author_email: nombre del email del autor.
* @author_company: nombre de la compañía del autor.
* @fecha_de_creación: dd-mm-yyyy.
* @fecha_de_ultima_actualización: dd-mm-yyyy.
* @versión 1.0
*/
public class InicialiadorJAXServlet extends GenericServlet implements Serializable{

private static final long serialVersionUID = -2482469492687227649L;

/**
* Constructor.
*/
public InicialiadorJAXServlet(){
}

/**
* init mètodo que se carga al iniciar el sistema y accede al método que manda a iniciar el Proceso.
* @throws ServletException
*
*/
public void init( ServletConfig configuracion ) throws ServletException{
System.out.println( "DENTRO DE 'init( ServletConfig configuracion )' " );

super.init( configuracion );

try{
this.IniciarWebService();
}
catch( Exception e ){
e.printStackTrace();
}
}

/**
* IniciarWebService, Mètodo que manda a iniciar el WebService.
*/
public void IniciarWebService(){
System.out.println( "DENTRO DE 'IniciarWebService()' " );

try{
String webService = URL_WEBSERVICE;

UsuarioDAOImpl daoImpl = new UsuarioDAOImpl();
daoImpl.inicializaWebService( webService );
}
catch( Exception e ){
e.printStackTrace();
}
}

/**
* service
* @param request
* @param response
*/
public void service( ServletRequest request, ServletResponse response ){
System.out.println( "DENTRO DE 'service( ServletRequest request, ServletResponse response )' " );
}

}


- Crear la Interfase y su clase que Implemente el WS. Además, para la generación en si del WS se puede realizar de 2 formas a continuación detalladas:


GENERAR WEBSERVICE DESDE UNA CLASE 'JAVA'
--------------------------------------------------------------------------


I.- UBICARSE DESDE LA RUTA 'SRC' DEL PROYECTO EN DOS:

Ejecutar en Orden:

(FORMA MANUAL)
A.- javac org/java/ws/bean/Usuario.java
B.- javac org/java/ws/servidor/UsuarioDAO.java
C.- javac org/java/ws/servidor/UsuarioDAOImpl.java

(FORMA DINAMICA)
set RAIZ_SRC= .
set JAVA_SRC=%RAIZ_SRC%\org\java\ws\bean\*.java
set JAVA_SRC=%JAVA_SRC%%RAIZ_SRC%\org\java\ws\servidor\*.java
set JAVA_SRC=%JAVA_SRC%%RAIZ_SRC%\org\java\ws\util\*.java
javac %JAVA_SRC%


D.- %JAXWS_HOME%/bin/wsgen -cp . org.java.ws.servidor.UsuarioDAOImpl -s . -verbose -r ..\WebContent\wsdl -wsdl
E.- Ejecutar esta linea de Comandos o desplegar desde el Servidor:
java org.java.ws.servidor.UsuarioDAOImpl
F.- Actualizar el nombre del 'WebService' en el WSDL, ya que luego de generarce no aparece.


GENERAR WEBSERVICE DESDE UN 'WSDL'
--------------------------------------------------------------


I.- UBICARSE DESDE LA RUTA 'RAIZ' DEL PROYECTO EN DOS:
- FORMA#1: wsimport WebContent\WEB-INF\wsdl\music.wsdl -s src -verbose
- FORMA#2: %JAXWS_HOME%/bin/wsimport WebContent\WEB-INF\wsdl\music.wsdl -s src -verbose

II.- UBICARSE DESDE LA RUTA 'SRC' DEL PROYECTO EN DOS:
- FORMA#1: wsimport ..\WebContent\WEB-INF\wsdl\music.wsdl -s . -verbose
- FORMA#2: %JAXWS_HOME%/bin/wsimport ..\WebContent\WEB-INF\wsdl\WEB-INF\music.wsdl -s . -verbose

Luego de esto se habrá generado el WS y se apreciaría un mensaje similar a este, al ingresar una URL similar a esta, que significa que el WS esta activo:

http://localhost:8099/ServidorWS_JAXWS_Generado/UsuarioDAOImpl
Web Services
No JAX-WS context information available.

Para el consumo del dicho WS ya desplegado, nos podemos apoyar también con JAX-WS, para ello realizamos lo siguiente:

GENERAR CLIENTE 'WEBSERVICE'
--------------------------------------------------


UBICARSE DESDE LA RUTA 'SRC' DEL PROYECTO EN DOS:

I.- GENERACION DE CLASES:

A.- DESDE 'URL':
%JAXWS_HOME%/bin/wsimport http://localhost:8090/servidorJaxWs/UsuarioDAOImpl?wsdl -s . -verbose

B.- DESDE 'FICHERO':
%JAXWS_HOME%/bin/wsimport ..\WebContent\wsdl\UsuarioDAOImplService.wsdl -s . -verbose


II.- COMPILACION & EJECUCION DE CLIENTE 'WS':

A.- Ejecución desde Consola 'DOS':
- javac org/java/ws/test/ClienteWS.java
- java org/java/ws/test/ClienteWS PARAMETRO

B.- Ejecución desde Clase JAVA:
- Ejecutar desde 'Java Aplication'.

Al ejecutar la clase: ClienteWS se probara dicho WS.

Para descargar el ejemplo completo, descargarlo de: AQUÌ.

viernes, 6 de noviembre de 2009

MANEJO DE 'WEB SERVICE' CON 'AXIS2'.

Hace un tiempo posteè sobre el manejo de Web Service con AXIS1, esta vez mostraré el manejo de Web Service (Su consumo) pero con AXIS2. Este Framework AXIS2 a diferencia de su versión anterior AXIS1 permite un mejor manejo de los Web Service Orientados a Objetos, ya que en la versión anterior de AXIS los Objetos del Service enviados como parámetros por el Web Service, se podían regenerar desde un cliente WS pero para poder parsearlos se necesita de forma obligada el número de serialVersionUID (Para poder comprobar que es el mismo objeto) , aquí AXIS1 era débil. AXIS2 supero eso ya que no tiene este traspié. AXIS2 solamente posee un problema al momento de la generación del cliente WS que mas adelante mostraremos y solucionaremos.

Al igual que el ejemplo posteado con AXIS1 mostraré la generación del Cliente WS y consumo de dichos procesos:

/********** PROCESOS 'WS' **********/
//Probando 'SUMA'.
clienteWS.getResultadoSuma( numero_01, numero_02, accesoWS );

//Probando 'RESTA'.
//clienteWS.getResultadoResta( numero_01, numero_02, accesoWS );

//Probando 'MULTIPLICACION'.
//clienteWS.getResultadoMultiplicacion( numero_01, numero_02, accesoWS );

//Probando 'DIVISION'.
//clienteWS.getResultadoDivision( numero_01, numero_02, accesoWS );

//Probando 'obtenerUsuario'.
//clienteWS.getObjetoUsuario( accesoWS );

//Probando 'obtenerListaUsuarios'.
//clienteWS.getListaUsuarios( accesoWS );;
/***********************************/

Los pasos son los siguientes:

1.- Tenemos el WSDL ya generado del servidor “UsuarioServiceImpl.wsdl” , este WSDL esta en la ruta: WebContent/wsdl/UsuarioServiceImpl.wsdl. En base a esta ruta generaremos por medio de consola el Cliente AXIS2, pero tendremos que configurar las variables de entorno antes.

2.- Bajarte la ultima versión de AXIS2: http://ws.apache.org/axis2/1_5_1/installationguide.html

3.- Ubicarla en una ruta en tu PC: “D:\JAVA\Axis\axis2-1.5.1”

4.- Registrar las variables de entorno (Tanto en Usuario como en Sistema):



5.- Generar el cliente AXIS2 desde consola aplicando el siguiente còdigo desde la ruta raiz del proyecto trabajado:

%AXIS2_HOME%/bin/WSDL2Java -p org.java.service -uri WebContent/wsdl/UsuarioServiceImpl.wsdl -s



6.- En este momento AXIS2 genera un error:

Es posible que cuando se desee generar un cliente JAVA con AXIS2 en base a un WSDL, uno encuentre con un error así:

Unexpected subelement 'XXXX'

Esto se debe a que AXIS2 genera el Cliente WS de una forma no totalmente correcta. Ya que confunde los NameSpaceURI. Supongamos como en este caso que el Servidor WS posee dos paquetes:

- PAQUETE DEL OBJETO: org.java.bean
- PAQUETE DEL WS: org.java.servidor.ws

Al momento de la generación del Cliente WS con AXIS2, los NameSpaceURI se invierten y quedan de la siguiente manera:

- NAMESPACE APUNTANDO AL OBJETO: “http://bean.java.org"
- NAMESPACE APUNTANDO AL WS: "http://ws.servidor.java.org"

Aquí esta el problema y la solución seria buscar la clase 'Stub' generada, en este caso 'ConsultaWSServiceStub' y en ella buscar por cada Objeto que se trabaje su:

static MY_OBJETO parse:

/**
* Factory class that keeps the parse method
*/
public static class Factory{

/**
* static method to create the object Precondition: If this object is an element, the
* current or next start element starts this object and any intervening reader events
* are ignorable If this object is not an element, it is a complex type and the reader
* is at the event just after the outer start element Postcondition: If this object is
* an element, the reader is positioned at its end element If this object is a complex
* type, the reader is positioned at the end element of its outer element
*/
public static Usuario parse( javax.xml.stream.XMLStreamReader reader ) throws java.lang.Exception{

Y cambiar el NameSpace para cada campo de > cada Objeto trabajado, de la siguiente forma:

AQUI SE DA EL 'ERROR':

while( !reader.isStartElement() && !reader.isEndElement() )
reader.next();
if( reader.isStartElement() &&
new javax.xml.namespace.QName( "http://bean.java.org", "nombre" ).equals( reader.getName() ) ){
nillableValue = reader.getAttributeValue( "http://www.w3.org/2001/XMLSchema-instance", "nil" );
if( !"true".equals( nillableValue ) && !"1".equals( nillableValue ) ){
java.lang.String content = reader.getElementText();
object.setNombre( org.apache.axis2.databinding.utils.ConverterUtil.convertToString( content ) );
}
else{
reader.getElementText(); // throw away text nodes if any.
}
reader.next();
} // End of if for expected property start element
else{
// A start element we are not expecting indicates an invalid parameter was
// passed throw new org.apache.axis2.databinding.ADBException( "Unexpected subelement " + reader.getLocalName() );
}

AQUI SE DA EL 'SOLUCION':

while( !reader.isStartElement() && !reader.isEndElement() )
reader.next();
if( reader.isStartElement() &&
new javax.xml.namespace.QName( "http://ws.servidor.java.org", "nombre" ).equals(
reader.getName() ) ){
nillableValue = reader.getAttributeValue( "http://www.w3.org/2001/XMLSchema-instance", "nil" );
if( !"true".equals( nillableValue ) && !"1".equals( nillableValue ) ){
java.lang.String content = reader.getElementText();
object.setNombre(
org.apache.axis2.databinding.utils.ConverterUtil.convertToString( content ) );
}
else{
reader.getElementText(); // throw away text nodes if any.
}
reader.next();
} // End of if for expected property start element
else{
// A start element we are not expecting indicates an invalid parameter was
// passed throw new org.apache.axis2.databinding.ADBException( "Unexpected subelement " + reader.getLocalName() );
}

7.- Creamos la clase: org/java/client/ClienteWS_Generado.java y vamos descomentando y ejecutando los procesos anteriormente nombrados uno por uno para probar su manejo. Recordar que primero se tiene que desplegar el demo del 'Proyecto Servidor' que es parte del demo posteado llamado: Ejemplo Web Service con JAX-WS , para poder probar sin problemas el Cliente WS con AXIS2.

Para mayor detalle descargar el ejemplo completo: AQUÌ.

lunes, 1 de junio de 2009

MANEJO DE 'WEB SERVICE' CON 'AXIS1'.

Ultimamente en mi nuevo trabajo me solicitaron la integracion de dos sistemas que trabajaban por separado y analizando decidi aplicar 'Web Service'(WS), asi que buscando decidi aplicar este muy buen Framework para manejo en JAVA de Web Service 'AXIS1'. El ejemplo presentado acontinuaciòn consiste en dos proyectos JAVA:

1.- Ejemplo_ServidorWS_AXIS1:
- Posee clases de conexion a MySql.
- Posee un Patròn DAO y las Interfaces respectivas.
- Posee Servicios de acceso.
- Aqui se genarara el 'WSDL'(Que es un XML mapeado con los paràmetros que accederàn de un sistema al otro), mediante la herramienta que brinda Eclipse.

2.- Ejemplo_ClienteWS_AXIS1:
- Posee dos ejemplos de Cliente 'Web Service', el primero generado mediante la herramienta del Eclipse para generar un 'Cliente WS' en base al 'WSDL' ya creado, y el segundo cliente es en base varias clases que brinda 'AXIS' para el acceso automàtico en base a solo el nombre de la ruta del 'WSDL' en String.

Datos Importante (Sobre el Ejemplo a Descargar):
- El ejemplo del manejo de Web Service esta preparado para correr con platformas JAVA v1.5 y v1.6 (Aqui se debe quitar de a carpeta 'lib': jsp-api.jar y servlet.jar ya que vienen dentro del 'JDK-1.6' sino crea conflicto y no levantar la aplicaciòn), trabaja con una conexion a MySql (El Stript se encuentra dentro del Aplicativo Servidor) y fue desarrollado en Eclipse v3.3.

- Para levantar el 'Web Service', se tiene que tener ya un proyecto Java listo con las conexion a MySql, que trabajara como 'Servidor' y en base a la Implementacion de una Interface 'DAO' o la de un 'Servicio' se generara el 'WSDL', donde se mapearan los datos de entrada y salida para la interconexion de los sistemas. (Al correr la aplicaciòn con el Tomcat, se levanta junto con la aplicacion el servicio 'WSDL'). Ver imagenes:

Se muestra el arbol de la aplicaciòn que servirà de Servidor para el 'WS'.

Comenzamos a generar el 'WS' con la herramienta de Eclipse.

Seguir pasos que se muestran en la imagen.

Chequear los mètodos que serviràn para la generaciòn del 'WS'
(Seran mapeados en el XML).

Iniciar el Servidor y pulsar finalizar.

Se levantarà la aplicaciòn y se mostrarà una pàgina 'JSP'.

Del 'WDSL' generado obtendremos la ruta del del 'WSDL' para probar si el servicio esta iniciado.

A la vez que se levanta el servidor se inicia el Servicio del 'WS'. Observemos el 'WSDL' generado agregando al link el '?wsdl'.

Luego de esto, para generar el cliente con la herramienta que facilita el Eclipse
copiamos la carpeta 'WSDL' con todo su contenido del Proyecto Java que sirve de 'Servidor' al proyecto que servirà de 'Cliente' y del 'UsuarioDaoImpl.wsdl' generar las clases base.


Dar los cheks respectivos que se muestran en la imagen.

Se muestra la ubicaciòn donde se generà las clases de apoyo al 'WS' (org.java.dao) en la aplicacion 'Cliente'.

Se muestran las clases generadas en el proyecto Cliente 'WS'.

Luego de estos pasos, ya podemos trabajar con el cliente 'WS'. Mostrarè dos formas de realizar un cliente 'WS' para realizar un mantenimiento via 'WS', los procesos seràn los siguientes y se ejecutaràn en base al orden que sean descomentados:

/********** PROCESOS 'WS' **********/
clienteWS.registrarUsuario( accesoWS );
//clienteWS.modificarUsuario( accesoWS );
//clienteWS.eliminarUsuario( accesoWS );
//clienteWS.obtenerObjetoUsuario( accesoWS );
//clienteWS.obtenerListaObjetosUsuario( accesoWS );
/**************************************/

1.- Cliente 'WS' en base a las clases generadas:'src.org.java.client.ClienteWS_Generado.java', utiliza las clases generadas por Eclipse para conectarse al 'WSDL'.

2.- Cliente 'WS' de acceso automàtico sin utilizar ninguna clase generada:'src.org.java.client.ClienteWS.java', no necesita ninguna clase sino que utiliza las Clases que brinda AXIS para el acceso automàtico, necesitando simplemente la ruta del 'WSDL' en String.

Para mayor detalle descargar el ejemplo completo: AQUI.