Web Services con Axis2. Configuración y ejemplo

19
155650

Web Services con Axis2. Configuración y ejemplo

  1. Web Services con Axis2. Configuración y ejemplo
    1. Introducción
    2. Requisitos
    3. Configuración del software
    4. Ejemplo de un Web Service con Axis2
    5. Conclusión

Introducción

Este es un tutorial básico que introduce a los servicios web en Java, y muestra cómo configurar el equipo con las herramientas necesarias para poder crear luego un web service de ejemplo.

Utilizaremos Axis2 para publicar el servicio web, y Eclipse como herramienta para facilitarnos el proceso, no obstante el código es simple y podría hacerse todo por línea de comandos. Puedes mirar la sección Tutoriales Recomendados, al final de esta página, para profundizar y seguir aprendiendo sobre el tema (o un buen libro, ¡por supuesto!).

Requisitos

Utilizaremos el siguiente software:

Con lo anterior aseguro un correcto funcionamiento, pero si quieres utilizar otras versiones, adelante.

Configuración del software

Lo explicaré para las rutas del software que manejo en mi ordenador (obviamente sólo son orientativas, adáptalas en tu caso a tu sistema operativo y estructura de directorios).

1.- Sun Java JDK 5.0 update 16

Realizaremos la instalación y estableceremos en nuestro sistema la variable JAVA_HOME. En mi equipo en concreto es:

JAVA_HOME=C:\Herramientas\Java\jdk1.5.0_16

2.- Apache Tomcat 6.0.18

Simplemente descomprimimos el Tomcat en una carpeta, y establecemos la variable CATALINA_HOME a la ruta absoluta del directorio descomprimido. En mi caso es:

CATALINA_HOME=C:\TutorialWS\apache-tomcat-6.0.18

3.- Apache Axis2 1.4.1

Descomprimimos la versión zip de la distribución WAR, y el fichero axis2.war lo vamos a copiar en

C:\TutorialWS\apache-tomcat-6.0.18\webapps

Asimismo descomprimimos la distribución binaria en una carpeta, y establecemos la variable AXIS2_HOME a la ruta absoluta del directorio descomprimido:

AXIS2_HOME=C:\TutorialWS\axis2-1.4.1

Y añadimos a la variable PATH del sistema la ruta:

C:\TutorialWS\axis2-1.4.1\bin

Para comprobar que el servidor y el motor de axis se han instalado correctamente, arrancamos el servidor ejecutando CATALINA_HOME\bin\startup.bat (ojito con los cortafuegos instalados, dar acceso a puertos y programas de este tutorial), y aparecerá una consola con las siguientes trazas:

Despliegue de Axis2 en Tomcat

Todo ha ido bien. Podemos comprobarlo accediendo a la URL http://localhost:8080/axis2:

Pagina de bienvenida de Axis2
Página de bienvenida de Axis2

4.- Eclipse Ganymede

Lo descomprimimos en una carpeta, por ejemplo

C:\Herramientas\eclipseGanymede

Y establecemos como workspace la ruta (si no existe, crearla antes): C:\TutorialWS\ejercicio

Ejemplo de un Web Service con Axis2

Vamos a hacer un servicio web servidor de echo (vaya, ¡que original!) al que le invoquemos con nuestro nombre y nos responda. Haremos también el programa cliente que haga la petición.

Recordemos brevemente que si disponemos del descriptor WSDL (Web Service Description Language), podemos crear el esqueleto del web service servidor (proveedor) y/o su cliente. Así, los programadores podemos desperocuparnos del manejo de los componentes, procesos y protocolos de comunicación (HTTP, FTP, SMTP, JMS, SOAP, XML…) y centrarnos en implementar la funcionalidad.

Esquema de cliente y web service servidor generados a partir del descriptor WSDL
Esquema de cliente y proveedor generados a partir del descriptor WSDL

Pueden darse otras combinaciones:

  • Que el servidor ya exista y sólo queramos crear un cliente para dialogar. Generalmente nos darán el WSDL para decirnos cómo ‘hablar’ con el servidor.
  • Que no tengamos nada pero sepamos la funcionalidad que hará el web service. A partir de una interfaz en la que definamos las operaciones, podemos generar el WSDL, y de ahí, el procedimiento antes explicado tanto para el cliente, servidor o ambos.

La primera de ellas va a ser la aproximación para crear nuestro ejemplo. Comencemos:

1.- Crear el web service servidor

Creamos un nuevo proyecto Java en Eclipse (File | New | Java | Java Project) llamado ServidorEchoWS. Nos aseguramos de que estamos trabajando con Java 5 para evitar problemas si tenemos alguna otra JRE en el sistema:

  • Window | Preferences | Java | Installed JREs, y que esté seleccionado jre_1.5_0.16
  • Window | Preferences | Java | Compiler, Compiler compliance level: 1.5

Ahora creamos un paquete com.autentia.ws.servidor y ahí una clase llamada Echo:

package com.autentia.ws.servidor;

/**
 * <p>
 * Echo.java <br/> Clase que implementa la logica de nuestro web service
 * </p>
 * 
 * 
 * @author Ivan Garcia Puebla - www.autentia.com
 * @version 1.0
 */
public class Echo {

	/**
	 * Metodo que implementa la funcionalidad de saludo
	 * 
	 * @param nombre
	 *            Nombre de la persona que invoca el servicio
	 * @return Cadena de saludo
	 */
	public String saludar(String nombre) {

		return "Hola " + nombre;
	}

	/**
	 * 
	 * Metodo que implementa la funcionalidad de despedida
	 * 
	 * @param nombre
	 *            Nombre de la persona que invoca el servicio
	 * @return Cadena de despedida
	 */
	public String despedir(String nombre) {

		return "Adios " + nombre;
	}

}

A nivel raíz del protecto creamos una carpeta META-INF y en su interior un fichero llamado services.xml, que será el descriptor del web service:

<?xml version="1.0" encoding="UTF-8"?>
<service>
	<description> Web service que emite un saludo o una despedida
	</description>
	<messageReceivers>
		<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
			class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
	</messageReceivers>
	<parameter name="ServiceClass">com.autentia.ws.servidor.Echo
	</parameter>
	<operation name="saludar" mep="http://www.w3.org/2004/08/wsdl/in-out" />
	<operation name="despedir" mep="http://www.w3.org/2004/08/wsdl/in-out" />
</service>

En este punto, la estructura del proyecto será como muestra la imagen:

Estructura del proyecto del web service proveedor en Eclipse

Vamos a crear el ensamblado de tipo aar (Axis ARrchive, que viene a ser el equivalente al jar de Java). Botón derecho sobre el nombre del proyecto | Export | Java | Jar File, pulsamos Next y en la siguiente pantalla deseleccionamos los «.classpath» y «.project» y como ruta en input JAR File ponemos por ejemplo C:\TutorialWS\EchoService.aar:

Configuracion del ensamblado EchoService.aar
Configuracion del ensamblado EchoService.aar

Pulsamos Finish. A continuación accedemos a la carpeta C.\TutorialWS y copiamos el fichero EchoService.aar en CATALINA_HOME\webapps\axis2\WEB-INF\services. A los pocos segundos, Axis detectará que hay un nuevo recurso que debe ser desplegado, y en la consola de Tomcat aparecerá esta traza:

Despliegue correcto del web service en Axis2
Despliegue correcto del web service en Axis2

Si accedemos a la web http://localhost:8080/axis2/ y pulsamos en Services, veremos que aparece el nuevo servicio en la lista:

Web service EchoService activo
Web service EchoService activo

Ya tenemos el web service proveedor publicado y a la espera de que un cliente lo invoque. Ahora vamos a crearlo.

4.- Implementando el cliente

Como hemos explicado antes, si queremos utilizar un servicio web, tenemos que utilizar un cliente que sepa ‘dialogar’ con aquel. Para saber qué ofrece y cómo comunicarse, nos valdremos de un descriptor del servicio, un fichero XML que cumple la especificación WSDL (la más reciente es la versión 2.0).

Pediremos a Axis que nos dé el WSDL de nuestro servicio EchoService invocando la siguiente dirección http://localhost:8080/axis2/services/EchoService?wsdl. Lo guardamos en un fichero con el nombre echoservice.wsdl (precaución al guardarlo, que no se introduzcan caracteres externos al propio xml).

Debemos abrir y examinar el contenido de echoservice.wsdl y si vemos que en las etiquetas «<soap:address location=» aparece un número de IP en vez de localhost, cambiar a localhost. Por ejemplo:

<wsdl:service name="EchoService">
  <wsdl:port name="EchoServiceHttpSoap11Endpoint" binding="ns:EchoServiceSoap11Binding">
    <soap:address 
      location="http://87.105.13.213:8080/axis2/services/EchoService.EchoServiceHttpSoap11Endpoint/"/>
  </wsdl:port>
  <wsdl:port name="EchoServiceHttpSoap12Endpoint" binding="ns:EchoServiceSoap12Binding">
    <soap12:address 
      location="http://87.105.13.213:8080/axis2/services/EchoService.EchoServiceHttpSoap12Endpoint/"/>
  </wsdl:port>
  <wsdl:port name="EchoServiceHttpEndpoint" binding="ns:EchoServiceHttpBinding">
    <http:address 
      location="http://87.105.13.213:8080/axis2/services/EchoService.EchoServiceHttpEndpoint/"/>
  </wsdl:port>
</wsdl:service>

cambiar por:

<wsdl:service name="EchoService">
  <wsdl:port name="EchoServiceHttpSoap11Endpoint" binding="ns:EchoServiceSoap11Binding">
    <soap:address 
      location="http://localhost:8080/axis2/services/EchoService.EchoServiceHttpSoap11Endpoint/"/>
  </wsdl:port>
  <wsdl:port name="EchoServiceHttpSoap12Endpoint" binding="ns:EchoServiceSoap12Binding">
    <soap12:address
      location="http://localhost:8080/axis2/services/EchoService.EchoServiceHttpSoap12Endpoint/"/>
  </wsdl:port>
  <wsdl:port name="EchoServiceHttpEndpoint" binding="ns:EchoServiceHttpBinding">
    <http:address
      location="http://localhost:8080/axis2/services/EchoService.EchoServiceHttpEndpoint/"/>
  </wsdl:port>
</wsdl:service>

Volviendo a Eclipse, creamos un proyecto Java con el nombre ClienteEchoWS e importamos las librerías de Axis2: botón derecho sobre el proyecto ClienteEchoWS | Build Path | Configure Build Path | pestaña Libraries | Add External JARS… , navegamos hasta el AXIS2_HOME\lib, seleccionamos todos los .jar (aunque muchos no serán realmente necesarios), y OK.

Copiamos ahora el fichero echoService.wsdl en la carpeta de nuestro proyecto de eclipse de ClienteEchoWS, que estará en C:\TutorialWS\ejercicio\ClienteEchoWS. Abrimos una consola de línea de comandos y nos situamos en ese mismo directorio. Una vez ahí, ejecutamos el comando:

wsdl2java -uri echoservice.wsdl

Obtendremos un resultado como éste:

Ejecucion del comando wsdl2java
Ejecucion del comando wsdl2java

Con ello hemos creado las clases del cliente que resuelven por nosotros la comunicación con el web service. Volvemos a Eclipse, refrescamos el proyecto (boton derecho sobre ClienteEchoWS | Refresh) y veremos que se ha creado el paquete com.autentia.ws.servidor con dos clases: EchoServiceCallbackHandler.java y EchoServiceStub.java. Creamos en el proyecto un paquete com.autentia.ws.cliente y una clase Test.java con el siguiente código:

package com.autentia.ws.cliente;

import java.rmi.RemoteException;

import org.apache.axis2.AxisFault;

import com.autentia.ws.servidor.EchoServiceStub;

/**
 * <p>
 * Test.java <br/> Clase que prueba la invocacion a nuestro web service de echo
 * </p>
 * 
 * 
 * @author Ivan Garcia Puebla - www.autentia.com
 * @version 1.0
 */

public class Test {

	/**
	 * Metodo principal de la clase
	 * 
	 * @param args
	 */
	public static void main(String[] args) {

		/*
		 * Utilizamos el stub generado a partir del wsdl que logran establecer
		 * la conexion con el web service proveedor.
		 */
		EchoServiceStub customer = null;
		EchoServiceStub.Saludar request = null;
		EchoServiceStub.SaludarResponse response = null;

		try {

			// creamos el soporte y la peticion
			customer = new EchoServiceStub();
			request = new EchoServiceStub.Saludar();

			// establecemos el parametro de la invocacion
			request.setNombre("Eva");

			// invocamos al web service
			response = customer.saludar(request);

			// mostramos la respuesta
			System.out.println(response.get_return());

		} catch (RemoteException excepcionDeInvocacion) {
			System.err.println(excepcionDeInvocacion.toString());
		}

	}
}

En este punto, nuestro proyecto en Eclipse deberá tener el aspecto de la imagen:

Proyecto de ClienteEchoWS en Eclipse
Proyecto de ClienteEchoWS en Eclipse

Ejecutamos el cliente pulsando con el botón derecho sobre Test.java | Run As | Java Application. En la vista inferior Console veremos el resultado de la ejecución (el texto en rojo podemos ignorarlo, no estamos usando log4j) :

Resultado de la invocacion al web service
Resultado de la invocación al web service

El web service nos ha respondido correctamente saludándonos 🙂

¡Inténtalo ahora tú con el servicio de despedida!

Conclusión

Si este tutorial te ha servido para comenzar y romper el miedo a crear servicios web con Java, te animo a seguir aprendiendo. No olvidemos que la complejidad de las soluciones a desarrollar en proyectos reales requieren utilizar las múltiples capacidades y patrones de los web services en profundidad.

Cada día la arquitectura orientada a servicios (SOA) está más presente en las organizaciones, y dominar los web services se va convirtiendo en una necesidad, como nos muestra la alta demanda de la formación que impartimos en Autentia sobre estas tecnologías.

 

19 COMENTARIOS

  1. Hola a todos!!!

    Tengo un problema con el tutorial no me funciona la linea de comando \\\»wsdl2java -uri echoservice.wsdl
    \\\» y no se poque es la unica diferencia con el tutorial es que utilizo el apache-tomcat-6.0.18.
    Me podeis ayudar a saber porque es??

    Muchas gracias.

  2. Buenas no consigo ejecutar correctamente la instruccion wsdl2java -uri echoservice.wsdl, me devuleve el siguiente error:

    The JAVA_HOME environment variable is not defined correctly
    This environment variable is needed to run this program
    NB: JAVA_HOME should point to a JDK/JRE

    mis variables son:
    AXIS2_HOME –> C:\\\\Archivos de programa\\\\Apache Software Foundation\\\\axis2-1.4.1
    JAVA_HOME –> C:\\\\Archivos de programa\\\\Java\\\\jdk1.5.0_16\\\\bin
    PATH –> .;C:\\\\Archivos de programa\\\\CVSNT\\\\CVSNT Tools\\\\;C:\\\\Archivos de programa\\\\Apache Software Foundation\\\\axis2-1.4.1\\\\bin

    ¿ es correcto ?
    ¿¿¿ alguien podria ayudarme ???
    Gracias.

  3. Un motivo habitual de este error es instalar el software en directorios cuyas rutas contengan espacios. En vez de instalar en C:Archivos de Programa, prueba a instalar y configurar las variables en directorios sin espacios en el nombre, e.g. C:Herramientas. Un saludo.

  4. Estoy por terminar de realizar el tutorial estoy en Test.java | Run As | Java Application, pero me marca el siguiente error org.apache.axis2.AxisFault: Transport error: 404 Error: Not found, alguien que me pudiera orientar? Gracias! El manual si que me ha quitado el miedo a los WS Muchas Gracias!

  5. julylpzmtz, eso es que desde el cliente no llega a establecer la conexion con el servidor. Puesto que se conecta por HTTP, comprueba que: 1) el tomcat esté arrancado y el webservice servidor correctamente desplegado. 2) el puerto del servidor tomcat (8080) no esté bloqueado por un cortafuegos o antivirus. 3) la direccion IP del servidor es la correcta (recomendado poner localhost o 127.0.0.1 si estas haciendo el tutorial tal como se explica). Revisa con cuidado todo los pasos del tutorial.

  6. Hola tengo un problema. Tengo que conectarme a un Webservicies que esta en otro servidor. Monto el cliente a partir del WSDL. Ese cliente lo añado como . JAR a mi proyecto. Desde la Main al ejecutarlo me salta este error:
    org.apache.axis2.AxisFault: Connection refused: connect
    at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)
    Tengo las librerias de axis2 la version 1.4.1 añadidas a mi proyecto. Me queda algo por hacer???? He leido por algun foro que suba las librerias a la carpeta de tomcat common/lib, pero en el tomcat que estoy usando no aparece ese carpeta. Tengo Tomcat 6.0

  7. Jr, el servidor remoto está rechazando las conexiones. Comprueba que está accesible en tu red, que la IP es la correcta, que el puerto de Tomcat no está bloqueado por algún cortafuegos, como el propio del sistema operativo. En prinicpio no parece que sea problema ocn las librerías. Comprueba primero que te funciona tal como explica este tutorial.

  8. Buenos dias Ing. Puebla, de antemano gracias por compartir este excelente tutorial, le quiero comentar que realice con éxito el ejercicio utilizando Axis2-1.4.1, Tomcat 6.0.18 y JDK 1.6. Pero le comento que en mi equipo tuve que cambiar las versiones del Tomcat a la 5.0 y del JDK al 1.4.2, con los valores respectios de las variables de entorno. Realice de nuevo el ejericio, sin embargo al intentar correo el Test.Java me aparece los siguientes errores:

    java.lang.NullPointerException
    at com.autentia.ws.servidor.EchoServiceStub.saludar(EchoServiceStub.java:526)
    at com.autentia.ws.cliente.Test.main(Test.java:46)
    Exception in thread \\\»main\\\»

    De antemano gracias por su atención

  9. Buenas, gracias de antemano no solo por el tutorial si no por la estupenda pagina.

    Estoy generando un cliente con Axi2 1.5.1, y java jdk1.6.0_13

    cuando intento generar las clases con
    wsdl2java.sh -uri http://www.uri.com ?wsdl * ( direccion donde esta publicado el ws)
    se produce el siguiente error :
    Exception in thread \\\»main\\\» java.lang.NoClassDefFoundError: javax/wsdl/WSDLException
    at org.apache.axis2.wsdl.WSDL2Code.main(WSDL2Code.java:35)
    at org.apache.axis2.wsdl.WSDL2Java.main(WSDL2Java.java:24)
    Caused by: java.lang.ClassNotFoundException: javax.wsdl.WSDLException
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
    … 2 more
    $ java.lang.NoClassDefFoundError: javax/wsdl/WSDLException

    Gracias por su atención

  10. Buenas antes que nada Que buen tutorial :):):):):) me salvo la vida bueno solo una preguntotota 🙂 mmm en mi caso todo bien solo que cuando llego a la parte de ejecutar System.out.println(response.get_return()) en vez de saludarme me regresa un java.lang.NullPointerException y señala precisamente a esta linea 🙁 mmm la unica diferencia entre el tutorial y yo es que yo tengo el jdk1.6.0_21 de antemano gracias por todo :):):)

  11. Ya me quedo!!!!!!! JAJAJAJAJAJA llevo 3 dias intentando levantar el servicio y solo hoy lo pude hacer Gracias :):):) mi problema: no invoque el customer.saludar 😛 GRACIAS!!!

  12. Hola Ivan:
    Oye sigue el ejemplo y al levantar tomcat me manda el error Clustering has been disabled.
    intente accesar a Localhost:8080/axis2: pero no me devulve la pagina.
    Utilice tomcat 7.0.2 y Axis 1.5.2.
    Ojala me puedas orientar.
    Realmente solo estoy haciendo una aplicacion para intranet.
    Anteriormente use IIS y ASP, pero ahora con JSP intento utilizar las herramientas destinadas para este tipo de aplicaciones donde supongo tendra mejor performance como Tomcat y Axis, pero resulta dificil encontrar información, todos se limitan a decir que es muy sencillo pero para mi ha sido un poco completo, aunque la instalacion de tomcat si es sencilla.
    Saludos 🙂

  13. Soy principiante, la verdad, tu tutorial me ayudó muchísimo! gracias…

    CONSULTA: quizás un tanto pava jeje tengo que hacer un wsdl a partir de una interface, la cual recibe 2 parámetros de entrada y retorna unos 20 de salida. Como me conviene hacerlo? Creo un tipo de dato nuevo con esos parámetros? Uso una hashtable?

    muchas gracias!

  14. Hola Ivan ,
    Buenos días ,
    Tengo una pregunta quizá me puedas ayudar , estoy intentando realizar una migración de versión de Axis2 1.4 a Axis2 1.5 , cual seria la mejor forma de realizar esta migración?.El proyecto esta constriudo y configurado en eclipse con Axis2 1.4, y las clases se generan por medio de la ejecucion del comando $AXIS2_HOME/bin/wsdl2java.sh -g -d adb -s -ss -sd -uri wsdl/Services.asmx.wsdl -o

    Gracias ,

    Saludos,

  15. Tengo un problema con un proyecto de servicios… tengo un wsdl y y cree desde eclipse con el wsdl usando axis 2… cuestion le envio el request del servicio y bien… me responde in http.1.1 200 ok … bien hasta ahi … el problema surge en el response … ya que me redirecciona a un html el cual es un html de error… diras, el request es invalido pero hice un print que cacheo desde la consola por jvm, y el mismisimo request copiado y pegado en soapui da la respuesta correcta en xml… sinceramente … no se que puedo hacer, no se me ocurre nada.
    Quizas alguien pueda darme una chispa de esperanza.

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad