Esta metodología para diseñar "Web-Services" en Axis es una de las maneras más sencillas para ejemplificar el uso de SOAP; para efectos didácticos la Clase empleada como "Web-Service" será sumamente sencilla para lograr enfatizar los conceptos de esta Tecnología.
Calculadora.jws
public class Calculadora { public int sumar(int x, int y) { return x + y; } public int restar(int x, int y) { return x - y; } } |
La Clase Java anterior define dos métodos los cuales suman y restan respectivamente dos valores proporcionados como datos de entrada, nótese que esta Clase es definida con la terminación .jws
(Java Web Service) y no con la clásica terminación .java
.
Para ejecutar esta Clase dentro de Axis debe ser colocada bajo el WAR Axis ("Web-Archive") definido anteriormente, la clase debe ser colocada como Código Fuente y no debe ser compilada; recuerde que debido al contenido del archivo web.xml
en este WAR ("Web-Archive"), todo archivo terminado en .jws
será procesado por Axis.
Si en este momento revisa el URL :http://www.servidorprueba.com:8080/axis/Calculadora.jws
debe observar una consola de Axis indicando los servicios que se encuentran registrados ("deployed"), en dicho registro aún no se encuentra el "Web-Service" de Calculadora.jws
.
Sin embargo, a pesar que el "Web-Service" aún no se encuentra registrado ("deployed"), es posible accesarlo de un Cliente, esta es una de las ventajas de utilizar "Web-Services" de manera nativa (*.jws), el registro ("deployment") de "Web-Services" será descrito en la ultima sección de esta guia.
A continuación se describe el Cliente que puede accesar el "Web-Service" Calculadora.jws
.
ClienteCalc.java
import org.apache.axis.client.Call; import org.apache.axis.client.Service; import org.apache.axis.encoding.XMLType; import javax.xml.rpc.ParameterMode; public class ClienteCalc { public static void main(String [] args) throws Exception { String endpoint = "http://servidorprueba.com:8080/axis/Calculadora.jws"; if (args == null || args.length != 3) { System.err.println("Uso: ClienteCalc <sumar|restar> arg1 arg2"); return; } String method = args[0]; if (!(method.equals("sumar") || method.equals("restar"))) { System.err.println("Uso: ClienteCalc <sumar|restar> arg1 arg2"); return; } Integer i1 = new Integer(args[1]); Integer i2 = new Integer(args[2]); Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress( new java.net.URL(endpoint) ); call.setOperationName( method ); call.addParameter( "op1", XMLType.XSD_INT, ParameterMode.IN ); call.addParameter( "op2", XMLType.XSD_INT, ParameterMode.IN ); call.setReturnType( XMLType.XSD_INT ); Integer ret = (Integer) call.invoke( new Object [] { i1, i2 }); System.out.println("Resultado : " + ret); } } |
Este Cliente que accesa el "Web-Service" es una simple Clase que puede ser ejecutada de una consola ("shell"), otra alternativa pudo haber sido diseñar otro Servlet o posiblemente un EJB que accesará la funcionalidad; para compilar este Cliente que accesa el "Web-Service" es necesario que las diversas librerías de Axis se encuentren en el CLASSPATH de compilación, esto se debe a que el Cliente utiliza diversas Clases Axis para llevar acabo la comunicación con el "Web-Service".
Una vez compilada esta Clase basta ejecutar una secuencia como la siguiente para llamar el "Web-Service":
# java ClienteCalc sumar 234 23 Resultado : 257 # java ClienteCalc restar 34 42 Resultado : -8 # java ClienteCalc sumar 23 1 Resultado : 24 |
El despliegue anterior demuestra tres invocaciones hacia el "Web-Service" Calculadora.jws
.
A pesar de la sencillez del ejemplo anterior, su misma sencillez lo hace que posea diversas carencias :
El ejemplo anterior hace uso de Java tanto en el Cliente como Servidor, para llevar acabo la verdadera interoperabilidad ofrecida por SOAP es necesario generar un archivo con el WSDL ("Web-Services Description Language"), a través del cual será posible generar Clientes de diversos lenguajes.
Aún falto ejecutar ("deploy") el "Web-Service" dentro de Axis esto permite el primer paso para que sea descubierto en otros sistemas, vía UDDI ("Universal Description, Discovery and Integration Directory") .
Al utilizar "Web-Services" nativos (*.wsd) es necesario poseer el Código Fuente del "Web-Service", esto restringe que muchas Clases/Métodos existentes puedan ser invocados como "Web-Services".
En la última sección de esta guia es descrito como se lleva acabo el diseño de un "Web-Service" a través de WSDL/WSDD.