Los servicios web son en su conjunto una tecnología que se ha puesto de moda y a ido creciendo y ganando un espacio importante dentro de la industria del software.
Una de las tecnologías mas usadas es Apache Axis. El objetivo de este artículo es mostrar como se hace un servicio web desde cero utilizando Axis, pero de una forma lo suficientemente extraña que permita, mediante modificaciones mínimas, utilizarlo con otras tecnologías.
La idea de un web service es, básicamente, ofrecer “servicios” a quien los quiera utilizar y para ello, hay que realizar una interface que publique dichos servicios.
Nuestro primer paso, pues, consiste en crear una interface con los métodos que ofreceremos como servicios web. Dicha interface debe extender java.rmi.Remote.
package com.javier.myws; import java.rmi.RemoteException; public final class MyWebServiceImpl implements MyWebService { public final String HelloWorld() throws RemoteException { return "Hello world !"; } }
Una vez construida nuestra interface, debemos crear una clase que implemente la interface que creamos en el paso anterior y allí haremos todo el trabajo “real” de nuestro servicio web.
package com.javier.myws; import java.rmi.Remote; import java.rmi.RemoteException; public interface MyWebService extends Remote { String HelloWorld() throws RemoteException; }
Teniendo esto, solo nos queda compilar la interface y nuestra clase.
Luego de compilar, generaremos un archivo myws.jar donde meteremos los ficheros .class que se generaron en la compilación.
Con todo compilado, debemos generar el fichero wsdl, el cual usaremos luego para generar los stubs del cliente y el fichero wsdd que nos permitirá hacer el deploy del servicio que pretendemos publicar.
<target name="gen-wsdl" depends="compile"> <axis -java2wsdl output="${xml.dir}/wsdl/myservices.wsdl" location="http://dummy" namespace="urn:com:javier:myws" classname="com.javier.myws.MyWebServiceImpl" serviceportname="MyWsPort" typeMappingVersion="1.3" /> </target>
Una breve explicación de los parámetros que estamos usando:
output: el path y el nombre del archivo wsdl que intentaremos generar.
location: la url de nuestro servicio web. Usaremos dummy por defecto.
namespacepermite, etntre otras cosas, mapear beans con servicios.
classname: es el nombre completo de la clase que implementa nuestro servicio web.
serviceportname: es nombre de nuestro servicio o sea que a traves de este nombre ofreceremos al mundo los métodos definidos en nuestra interface e implementados en nuestra clase.
typeMappingVersion: compatibilidad con con version 1.3.
Una vez hayamos ejecutado esta tarea tendremos nuestro fichero wsdl listo.
Ahora, debemos crear un archivo donde declararemos los mapeos entre nuestros paquetes java y los namespaces de nuestro servicio. Tambien declararemos allí los mapeos entre nuestros beans y los namespaces que los definen en nuestro servicio.
Dado que nuestro servicio es muy simple y no define ningún bean, pues solo tenemos en el archivo namespaces.xml un mapeo entre nuestro paquete y el namespace que lo define en nuestro servicio.
Teniendo el wsdl, solo nos queda generar los stubs que nos permitirán tener un cliente de nuestro servicio web y en el mismo proceso obtendremos los archivos wsdl que nos permitirán hacer el deploy/undeploy del servicio.
Para generar stubs usaremos una tarea de ant de la siguiente manera:
< ?xml version="1.0"?> <java -wsdl-mapping xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://www.ibm.com/webservices/xsd/j2ee_jaxrpc_mapping_1_1.xsd" version="1.1"> <package -mapping> </package><package -type>com.javier.myws</package> <namespaceuri>urn:com:javier:myws</namespaceuri> </java>
Los parámetros se explican por si solos y los stubs y demas ficheros serán generados en el directorio definido en el parámetro output.
Una vez ejecutada la tarea, encontraremos en el directorio sobre el que definimos el output de la misma, un paquete de java definido a la inversa que nuestro paquete original. En este caso, un árbol de directorios myws/javier/com, donde veremos una lista de archivos. De todos ellos, el que nos interesa ahora es deploy.wsdd.
Abrimos dicho fichero y nos encontramos con esto:
<target name="genclientstubs" depends="gen-wsdl"> <axis -wsdl2java deployscope="session" serverSide="yes" skeletonDeploy="no" noimports="no" verbose="no" typeMappingVersion="1.3" testcase="no" namespacemappingfile="${xml.dir}/namespaces.xml" output="${client.src.dir}" url="${xml.dir}/wsdl/myservices.wsdl"> </axis> </target>
En la línea del parámetro que dice: parameter name="className" modificamos el value por el nombre completo de nuestra clase o sea com.javier.myws.MyWebServiceImpl.
Con esto, ya estamos listos para hacer el deploy. Primero deberemos detener el servidor Axis, luego copiaremos el archivo myws.jar al directorio lib de Axis, para después volver a arrancar el servidor.
Ahora si, usaremos una tarea de ant para realizar el deploy de la aplicación.
<!-- Use this file to deploy some handlers/chains and services --> <!-- Two ways to do this: --> <!-- java org.apache.axis.client.AdminClient deploy.wsdd --> <!-- after the axis server is running --> <!-- or --> <!-- java org.apache.axis.utils.Admin client|server deploy.wsdd --> <!-- from the same directory that the Axis engine runs --> <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <!-- Services from MyWebServiceImplService WSDL service --> <service name="MyWsPort" provider="java:RPC" style="rpc" use="encoded"> <parameter name="wsdlTargetNamespace" value="urn:com:javier:myws"/> <parameter name="wsdlServiceElement" value="MyWebServiceImplService"/> <parameter name="wsdlServicePort" value="MyWsPort"/> <parameter name="className" value="myws.javier.com.MyWsPortSoapBindingImpl"/> <parameter name="wsdlPortType" value="MyWebServiceImpl"/> <parameter name="typeMappingVersion" value="1.3"/> <operation name="helloWorld" qname="operNS:HelloWorld" xmlns:operNS="urn:com:javier:myws" returnQName="HelloWorldReturn" returnType="rtns:string" xmlns:rtns="http://schemas.xmlsoap.org/soap/encoding/" soapAction="" > </operation> <parameter name="allowedMethods" value="helloWorld"/> <parameter name="scope" value="Session"/> </service> </deployment>
Allí indicaremos el puerto del servidor donde tenemos nuestro Axis, la ip o el nombre (target server) del mismo, el path al adminservice de Axis y el path a nuestor archivo deploy.wsdd.
Al ejecutar esta tarea estaremos haciendo el deploy de nuestro servicio.
2 Responses to Crear web services con Axis – Parte I
martín
August 14th, 2008 at 2:01 pm
Hola, hay algo que no entiendo bien el ejemplo, podrías poner el código xml del web.xml .
Gracias de antemano.
Saludos
admin
September 5th, 2008 at 9:32 pm
Ya esta el código. Había actualizado el wordpress y me había comido un plugin. I’m sorry.