Crear una estructura compleja del tipo Array en un servicio web Axis2
0. Índice de contenidos.
- 1. Introducción.
- 2. Entorno.
- 3. Instalación.
- 4. Crear el Servidor.
- 5. Configuración en SOAP UI.
- 6. Crear el Cliente.
- 7. Conclusiones.
1. Introducción
En este tutorial se pretende enseñar a crear la primera de las estructura complejas que se pueden implementar
en los servicios web : los arrays
Hasta el momento casi todos los servicios web utilizan como parámetros o bien devuelven tipos simples (recordar
que venían definidos por el XML Schema) como pueden ser un int, double, String, etc. Pero hay veces en que se
necesitan devolver algunas estructuras más complejas como puede ser un array o bien un Java bean
El array es la estructura compleja más utilizada en la programación y se clasifica en base a sus dimensiones :
- Array unidimensional (Vector) -> Es decir contiene N Elementos
- Array multidimensional (Matriz) -> Es decir contiene N1 * N2 * … * Nm donde cada N<num> es una dimensión
Nota : Los arrays casi siempre requieren que se establezca la dimensión durante su construcción, en caso de que
no se sepa el tamaño previo normalmente viene dado por su inicialización
Los elementos que componen un array deberían de ser alguno de los considerados como válidos (tipos simples , Java Beans , etc),
aunque algunas veces estos son heterogéneos y se convierten en un cajón desastre donde se guarda todo, es decir, donde
cada uno de los elementos pertecene a un tipo diferente
En caso de SOAP además permite distinguir dos tipos de arrays :
- Parcial : Array que no se encuentra totalmente polado por lo que el resto de valores serñan del tipo null
- Disperso : Array donde se inicializan las posiciones no contiguas del array
La utilización de estos dos tutoriales no será explicado en este tutorial 😉
2. Entorno.
El tutorial está escrito usando el siguiente entorno:
- Hardware: Portátil Asus G50Vseries (Core Duo P8600 2.4GHz, 4GB RAM,320 GB HD).
- Sistema operativo: Windows Vista Ultimate.
- Mozilla Firefox 2.0.0.20
- Apache Tomcat 7.0.0
- Axis2 1.5.1
- Soap UI 3.5
3. Instalacion.
Para la realización de este tutorial ser requiere :
1) Tener instalada servidor de aplicaciones Apache Tomcat (En mi caso uso la versión 7.0)
2) Tener la versión binaria de Axis2 (En mi caso uso la versión 1.5.1) descargada y descomprimida en un directorio
3) Tener la versión WAR de Axis2 (En mi caso uso la versión 1.5.1) desplegada en el Tomcat
4) Tener instalada la herramienta SOAP UI
Nota : Utilizaremos para su desarrollo la herramienta Eclipse
4. Crear el Servidor
PASO 1 : Crear un proyecto Java llamada Axis2ArrayWS
Se creará una estructura del proyecto como la siguiente
PASO 2 : Crear el paquete «com.acme.es.servidor» sobre la carpeta src
PASO 3 : Crear una clase Java llamada BasicService
PASO 4 : Crear un método que utilize como parámetro un array
... public String generateSentenceParameter (String[] words){ String result = ""; if (words.length!=0){ for (String w : words){ result += w; } } return result; } ...
PASO 5 : Crear un método que devuelva un array
... public String[] generateSentenceResult(){ String[] words = new String [4]; words[0] = "Empresa 1"; words[1] = "Empresa 2"; words[2] = "Empresa 3"; words[3] = "Empresa 4"; return words; } ...
Al final la clase quedará de la siguiente forma :
PASO 6 : Crear la carpeta META-INF a nivel de la carpeta src
PASO 7 : Crear dentro de la carpeta META-INF el descriptor de servicio : services.xml
Introducimos el siguiente texto :
Servicio que hace uso de arrays com.acme.ws.servidor.BasicService
PASO 8 : Crear el fichero de ensamblado AAR (Axis ARchive)
Para ello exportar el proyecto como si fuera un JAR pero poniendo de nombre Axis2Array.aar
Nota : No incluir .classpath ni .project
Arrancar Tomcat si esta parado
PASO 9 : Copiar el fichero AAR en <CATALINA_HOME>\webapps\axis2\WEB-INF\services
PASO 10 : Verificar en la consola de Tomcat la inclusión de este servicio
PASO 11 : Verificar el servicio desde la consola de administracion de Axis : http://localhost:8080/axis2/services/listServices
PASO 12 : Obtenemos el WSDL del servicio : http://localhost:8080/axis2/services/Axis2Array?wsdl
Guardamos el fichero anterior que vendrá dado en formato XML por formato WSDL
5. Probar el servidor con SOAP UI
PASO 1 : Cargamos la herramienta
PASO 2 : Creamos un proyecto nuevo con la URL del WSDL anterior
PASO 3 : Realizamos un test sobre el método de paso de parámetros
Para ello introducimos tantos <ser:words>TEXTO </ser:words> como elementos que queremos
que tenga el array (Recordar secuencialidad)
PASO 4 : Ejecutamos el test y verificamos la respuesta
PASO 5 : Realizamos un test sobre el método que devuelve un array
PASO 6 : Ejecutamos el test y verificamos la respuesta
Con esto tendremos probado nuestro Servidor 😉
6. Crear el cliente
PASO 1 : Creamos un proyecto Java llamada Axis2ArrayWSCliente
Se generará una estructura similar a la siguiente
PASO 2 : Copiamos a nivel de raiz el fichero Axis2Array.wsdl
PASO 3 : Generamos el Stub del cliente con la herramienta Axis2
Para ellos nos situamos por consola en el directorio del proyecto y ejecutamos la siguiente instrucción
- Si Axis2 NO esta en el Path : %AXIS2_HOME%\bin\wsdl2java -uri Axis2Array.wsdl
- Si Axis2 esta en el Path : wsdl2java -uri Axis2Array.wsdl
PASO 4 : Refrescamos el proyecto
Se habrán creado dos clases que nos permitirán comunicarnos con el servidor
PASO 5 : Incluir las librerías de Axis2
Con el botón derecho del ratón sobre el proyecto Properties -> Java Build Path , pestaña de
Libraries y pulsar sobre «Add Externar JARs»
PASO 6 : Crear un paquete «com.acme.ws.cliente»
PASO 7 : Crear una clase PruebaCliente.java
Esta clase dipondrá de dos métodos para realizar la llamada a los dos servicios
package com.acme.ws.cliente; import java.rmi.RemoteException; import com.acme.ws.servidor.Axis2ArrayStub; public class PruebaCliente { /** * Metodo que ejecutará el método del servicio en el que se le pasa * un array de cadenas como parametro */ public static void exampleParameterArray(){ //Establece los elementos encargados en realizar la peticion y la //respuesta Axis2ArrayStub customer = null; Axis2ArrayStub.GenerateSentenceParameter request = null; Axis2ArrayStub.GenerateSentenceParameterResponse response = null; try { //Creamos el soporte y la peticion customer = new Axis2ArrayStub(); request = new Axis2ArrayStub.GenerateSentenceParameter(); //Establecemos el parametro de la invocacion request.setWords(new String[]{"Hola ","a ","todos"}); //Invocamos al web service response = customer.generateSentenceParameter(request); //Mostramos la respuesta System.out.println(response.get_return()); } catch (RemoteException excepcionDeInvocacion) { System.err.println(excepcionDeInvocacion.toString()); } } /** * Metodo que ejecutar el método del servicio en el que se devuelve un array de cadenas */ public static void exampleResultArray(){ Axis2ArrayStub customer = null; Axis2ArrayStub.GenerateSentenceResultResponse response = null; try { //Creamos el soporte //En este caso no creamos la peticion puesto que no tendra parámetros de entrada customer = new Axis2ArrayStub(); //Invocamos al web service response = customer.generateSentenceResult(); //Mostramos la respuesta String[] result = response.get_return(); for (String s : result){ System.out.println("Elemento : "+s); } } catch (RemoteException excepcionDeInvocacion) { System.err.println(excepcionDeInvocacion.toString()); } } public static void main(String[] args) { exampleParameterArray(); exampleResultArray(); } }
PASO 8 : Ejecutar la clase
Con esto habriamos conseguido tener un servicio web en el que se utiliza la estructura
compleja de array
7. Conclusiones.
Espero haberos podido ayudar a entender un poco mejor las estructuras complejas de tipo array
en SOAP. Se ha tratado de que el ejemplo sea lo más claro posible para facilitar su entendimiento
sin entrar en ningúna complejidad a la hora de crear los servicios proporcionados.
Como habéis podido ver, para poder implementar un servicio web (Cliente y Servidor) hay que realizar
muchas acciones, pero por suerte para nosotros se puede decir que cambian muy poquitas cosas a la hora
de generar otros servicios web diferentes. Mucho ánimo con esto de la comunicación SOAP 😉
¿Sabes como retornar un array con nusoap?