Sei sulla pagina 1di 20

Servicios Web en JAVA

Los servicios web permiten invocar mtodos remotos de una manera estndar e independiente del lenguaje de programacin empleado. En la prctica se describen a travs de una serie de protocolos y estndares que facilitan la interoperabilidad entre aplicaciones. La idea bsica es que un cliente pueda invocar un procedimiento remoto y obtener unos resultados sin importar el sistema operativo o el lenguaje de programacin empleado en uno y otro extremo de la comunicacin. Bsicamente los servicios web son publicados a travs de un servidor de aplicaciones y pueden ser accedidos desde cualquier sitio (asumiendo que cuenta con los privilegios suficientes). Entre los protocolos y estndares utilizados, destacan los siguientes: SOAP (Simple Object Access Protocol) : Es el protocolo (basado en XML) que se emplea para invocar un servicio web y para obtener su resultado WSDL (Web Services Description Language) : Permite definir el servicio web y los mtodos y parmetros que deben emplearse para utilizarlo (en XML) UDDI (Universal Description, Discovery e Integration) : Permite publicar los servicios web en un sistema de directorios para facilitar su bsqueda y localizacin WS-Security : Un protocolo que puede usarse para controlar el acceso a los servicios web

JAX-WS El estndar JAX-WS (JAVA API for Web Services) es el que facilita en JAVA la creacin y acceso a servicios web. Este API nos simplifica la tarea de desarrollar servicios web evitando la complejidad de protocolos como SOAP. Para publicar servicios web mediante JAX-WS se emplean anotaciones, que no es ms que texto incluido dentro de un fichero JAVA. Para que una clase sea un servicio web deberemos emplear la anotacin javax.jws.WebService que identifica dicha clase como un endpoint de servicio web (bsicamente algo que se convertir en una URL a la que llamar para ejecutar alguno de los mtodos de la clase). Para ello, se aadir una anotacin @WebService() antes de la declaracin de la clase. Para especificar, dentro de la clase qu mtodos pueden ser invocados remotamente, basta con emplear la anotacin @WebMethod() delante de cada mtodo que queramos exponer:
import javax.jws.WebService; @WebService() public class Clase { public Clase(){ } @WebMethod() public tipo mtodo(parmetros) { ...

} ... }

La clase as creada debe ser compilada y desplegada en un servidor de aplicaciones como un archivo war. En este proceso, se generarn una serie de clases necesarias para comunicarse con el cliente. La anotacin @WebService puede llevar alguno de los siguientes elementos: name : permite definir el nombre del servicio. De no especificarlo, se aade PortType al nombre de la clase que implementa el servicio web (coincide con la etiqueta portType de WDSL) targetNamespace : especifica el nombre del espacio de nombres del servicio. De no especificarlo se usa el del paquete serviceName : permite especificar el nombre del servicio publicado. Por defecto se usa el nombre de la clase (etiqueta service de WDSL) wdslLocation : especifica la URI del endpoint donde se publica el servicio. Por defecto, la URL en la que se despliega el servicio endpointInterface : el nombre completo del servicio. Por defecto se aade Port a la clase que implementa el servicio.

La anotacin @WebMethod, por su parte, dispone de los siguientes elementos : operationName : el nombre del mtodo (etiqueta operation de WDSL) Action : el valor de la etiqueta soap:operation. Por defecto "" Exclude : especifica si el mtodo debe excluirse del interfaz del servicio (por defecto false)

Adicionalmente un @WebMethod puede especificar informacin sobre los parmetros mediante la anotacin @WebParameter, que puede llevar los siguientes elementos: name : nombre del parmetro en el WDSL (si no, se emplea arg0, arg1,) targetNamespace : el namespace del parmetro mode : modo del parmetro (Mode.IN por defecto, Mode.OUT y Mode.INOUT)

En la parte cliente, habra que emplear la herramienta wsimport que genera y compila las clases necesarias para acceder al servicio web remoto y a sus mtodos. Tras ello, simplemente hay que emplear objetos de las clases creadas para acceder al servicio web. WDSL (Web Service Description Language) Es un lenguaje, basado en XML, que se emplea para describir un servicio web. Se describe la forma de acceder a un servicio web, los tipos de datos que se van a emplear y los mtodos y parmetros disponibles. Los elementos bsicos de un documento WDSL son :

Types : contenedor de definiciones del tipo de datos mediante un esquema XML (xsd) message : definicin de un mensaje abstracto que puede constar de diferentes partes, cada una de ellas de un tipo diferente operation : descripcin abstracta de una accin admitida por el servicio portType : un conjunto de operaciones soportadas por uno o ms endpoints (interfaces del servicio) port : punto final nico que se define como la combinacin de un enlace y una direccin de red binding : un conjunto de un protocolo y una especificacin del formato de datos para un portType conreto service : una coleccin de endpoints relacionados. Un endpoint es la combinacin entre un binding y una URI

Generacin manual de un servicio Web Para ver un ejemplo simple vamos a emplear la herramienta wsgen de JAVA SE para generar las clases necesarias para publicar un servicio web. Los pasos a dar son los siguientes: Definir una clase con las anotaciones necesarias para especificar el servicio web y los mtodos que va a usar :

package WebServices; import javax.jws.WebMethod; import javax.jws.WebService; @WebService public class Calculadora { public Calculadora() { super(); } @WebMethod public int suma(int n1, int n2){ return n1+n2; } @WebMethod public int resta(int n1, int n2){ return n1-n2; } }

Generar las clases necesarias para la conexin de equipos remotos mediante la herramienta wsgen:

D:\prueba>javac WebServices\Calculadora.java D:\prueba>wsgen -cp . -wsdl WebServices.Calculadora -verbose -keep Note: ap round: 1

[ProcessedMethods Class: WebServices.Calculadora] [should process method: suma hasWebMethods: true ] [endpointReferencesInterface: false] [declaring class has WebSevice: true] [returning: true] [WrapperGen - method: suma(int,int)] [method.getDeclaringType(): WebServices.Calculadora] [requestWrapper: WebServices.jaxws.Suma] [should process method: resta hasWebMethods: true ] [endpointReferencesInterface: false] [declaring class has WebSevice: true] [returning: true] [WrapperGen - method: resta(int,int)] [method.getDeclaringType(): WebServices.Calculadora] [requestWrapper: WebServices.jaxws.Resta] [ProcessedMethods Class: java.lang.Object] WebServices\jaxws\Resta.java WebServices\jaxws\RestaResponse.java WebServices\jaxws\Suma.java WebServices\jaxws\SumaResponse.java Note: ap round: 2

Con esto se habrn creado las clases necesarias para publicar y acceder al servicio web. La opcin cp . indica que las clases estn en el directorio actual, -wdsl indica que queremos generar el fichero wsdl correspondiente al servicio web, -verbose para dar informacin detallada de la operacin y keep para que mantenga el cdigo fuente de las clases generadas (si no, slo generara los ficheros .class). Tras ello se habr creado en el directorio raz los ficheros CalculadoraService.wdsl que contiene la informacin del servicio y CalculadoraService_schema1.xsd que es el documento que permite validar que el wdsl est bien formado y donde se definen los tipos de datos de los mtodos y de las respuestas. NOTA: Es importante especificar la URL en la que se va a publicar el servicio en el fichero WDSL en la directiva : <soap:address location=" http://localhost:4444/CalculadoraService"/>. Adems se habr creado la carpeta jaxws donde se encuentran las clases generadas para publicar el servicio web Publicar el servicio web. Una forma simple de publicar un servicio web es emplear la clase javax.xml.ws.Endpoint para crear un miniservidor web a la escucha:

package WebServices; import javax.xml.ws.Endpoint; public class Publicador {

public static void main(String[] args) { Calculadora calculadora = new Calculadora(); Endpoint endpoint = Endpoint.create(calculadora); endpoint.publish("http://localhost:4444/CalculadoraService"); } }

Una vez creado, lo compilamos y lo ejecutamos:


D:\prueba>javac WebServices\Publicador.java D:\prueba>java WebServices.Publicador

Ahora podemos emplear el navegador para comprobar el WDSL del servicio (y que est operativo):

Desde este momento, cualquier cliente podra acceder al servicio web. Si queremos publicar el servicio web en un servidor de aplicaciones el proceso se complica considerablemente, por lo que es recomendable emplear las opciones proporcionadas por los entornos de desarrollo como JDeveloper, NetBeans o Eclipse Generacin de un servicio Web a travs de JDeveloper Lo primero que tenemos que definir es la clase que va a exponer la lgica de negocio del servicio web, es decir la clase donde especificaremos los mtodos que queremos que sean accesibles desde el exterior. Por ejemplo, para un conversor de euros a pesetas y viceversa:
package webservices;

public class Conversor { public double eurosApesetas(double importe){ return importe * 166.386; } public double pesetasAeuros(double importe){ return importe / 166.386; }

Una vez hecho, pasamos a la creacin del WebService. Para ello simplemente tenemos que elegir la opcin correspondiente en la opcin File New :

Y seguir los pasos del asistente. Seleccionamos la versin :

El componente a publicar (la clase JAVA creada en el paso anterior):

En la ventana siguiente no hacemos nada. Sirve para configurar los llamados Serive Point Interface (SEI) que son los que se emplean para publicar como servicio un JavaBean. Tras ello, seleccionamos los mtodos que queremos que estn accesibles a travs del servicio web:

Y ya podemos pulsar Finish (las ventanas restantes sirven para especificar clases adicionales con tipos de datos del web service, la poltica de seguridad que se van a seguir para decidiren qu condiciones se puede acceder al servicio, y si queremos manejadores que no son ms que clases que responden a los eventos de los mensajes SOAP para auditora, etc). Tras realizar el proceso en la ventana de la aplicacin se mostrar la clase como un servicio web :

Y, si accedemos a ella, comprobaremos que ha sido convenientemente anotada : Adems se ha generado un fichero web.xml con la informacin necesaria para publicar el servicio web (como si fuera un servlet):
<?xml version = '1.0' encoding = 'windows-1252'?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"> <servlet> <servlet-name>ConversorPort</servlet-name> <servlet-class>webservices.Conversor</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>ConversorPort</servlet-name> <url-pattern>/ConversorPort</url-pattern> </servlet-mapping> </web-app>

Si ahora seleccionamos la opcin Test Web Service se publicar el servicio y nos permitir probarlo desde dentro del JDeveloper:

Pulsando sobre Send Request :

Tambin podemos ver el WDSL pulsando sobre Open WDSL. Generacin manual de un cliente Web Para crear un cliente de un servicio Web de forma manual, basta con emplear la herramienta wsimport de JAVA SE. Esta herramienta crear las clases (llamadas stub) necesarias para acceder al servicio web :
D:\prueba\clienteConversor>wsimport http://localhost:7101/Application3-WebServic es-context-root/ConversorPort?WSDL -p conversor -verbose parsing WSDL...

generating code... conversor\Conversor.java conversor\ConversorService.java conversor\EurosApesetas.java conversor\EurosApesetasResponse.java conversor\ObjectFactory.java conversor\PesetasAeuros.java conversor\PesetasAeurosResponse.java

conversor\package-info.java compiling code... javac -d D:\prueba\clienteConversor\. -classpath C:\Program Files\Java\jdk1.6.0_ 18\lib\tools.jar;C:\Program Files\Java\jdk1.6.0_18\classes Xbootclasspath/p:C:\ Program Files\Java\jdk1.6.0_18\jre\lib\rt.jar;C:\Program Files\Java\jdk1.6.0_18\ jre\lib\rt.jar D:\prueba\clienteConversor\.\conversor\Conversor.java D:\prueba\c lienteConversor\.\conversor\ConversorService.java D:\prueba\clienteConversor\.\c onversor\EurosApesetas.java D:\prueba\clienteConversor\.\conversor\EurosApesetas Response.java D:\prueba\clienteConversor\.\conversor\ObjectFactory.java D:\prueb a\clienteConversor\.\conversor\PesetasAeuros.java D:\prueba\clienteConversor\.\c onversor\PesetasAeurosResponse.java D:\prueba\clienteConversor\.\conversor\packa ge-info.java

Con ello se habr creado el directorio conversor (la opcin p especifica el paquete) y, dentro de l estarn las clases necesarias para acceder al servicio:
D:\prueba\clienteConversor>dir conversor 12/01/2012 19:33 <DIR> . 12/01/2012 19:33 <DIR> .. 12/01/2012 19:33 926 Conversor.class 12/01/2012 19:33 2.086 ConversorService.class 12/01/2012 19:33 606 EurosApesetas.class 12/01/2012 19:33 704 EurosApesetasResponse.class 12/01/2012 19:33 2.559 ObjectFactory.class 12/01/2012 19:33 234 package-info.class 12/01/2012 19:33 606 PesetasAeuros.class 12/01/2012 19:33 704 PesetasAeurosResponse.class 8 archivos 8.425 bytes

De nuevo s hubiramos empleado la opcin keep tambin se habran generado los ficheros .java asociados. Las clases que debemos emplear son ConversorService y Conversor. La primera es la que define un objeto asociado al servicio web y que dispone de un mtodo que retorna el puerto del servicio web (en nuestro caso ConversorPort), mientras que la segunda es la que nos permite acceder a los mtodos. As que el programa podra ser:
import conversor.*; public class PruebaConversor { public static void main(String[] args) { ConversorService cs = new ConversorService(); Conversor c = cs.getConversorPort();

System.out.println("12.5 euros son " + c.eurosApesetas(12.5) + " pesetas"); } }

Ahora compilamos y ejecutamos:


D:\prueba\clienteConversor>javac PruebaConversor.java D:\prueba\clienteConversor>java PruebaConversor 12.5 euros son 2079.825 pesetas

Generacin de un cliente Web desde JDeveloper En el caso de emplear un entorno de desarrollo la cosa se simplifica enormemente. Lo nico que tenemos que hacer es emplear el asistente para crear un Web Service Proxy :

Elegimos como implementacin JAX-WS :

Ponemos la ruta al fichero WSDL del servicio web :

Luego indicamos en qu paquetes queremos las clases stub:

El resto de las opciones las dejamos por defecto.

En el ltimo paso se nos mostrar un resumen de los elementos que se van a generar:

En este caso, adems de crearnos las clases necesarias para acceder al servicio, se nos genera una clase CalculadoraPortClient con todo preparado para probar los mtodos. Slo hay que completar el cdigo:
package calculadora; import javax.xml.ws.WebServiceRef; // !THE CHANGES MADE TO THIS FILE WILL BE DESTROYED IF REGENERATED! // This source file is generated by Oracle tools // Contents may be subject to change // For reporting problems, use the following // Version = Oracle WebServices (11.1.1.0.0, build 100408.1504.05443) public class CalculadoraPortClient { @WebServiceRef private static CalculadoraService calculadoraService; public static void main(String [] args) { calculadoraService = new CalculadoraService(); Calculadora calculadora = calculadoraService.getCalculadoraPort(); // Add your code to call the desired methods. System.out.println("128 + 56 = " + calculadora.suma(128, 56)); System.out.println("128 - 56 = " + calculadora.resta(128, 56)); } }

La salida
128 + 56 = 184 128 - 56 = 72

Process exited with exit code 0.

Cliente desde NetBeans Para trabajar con servicios web SOAP en NetBeans es necesario disponer de los plugins Web Application y SOAP Web Services. NOTA: NetBeans emplea su propio servidor de aplicaciones : el GlassFish Server. En este caso elegimos la opcin New Web Service Client y especificamos el WDSL al que queremos acceder:

Y ya est. Se generarn las clases necesarias que podremos emplear en nuestra aplicacin :

Ahora es necesario construir el proyecto (Clean and Build) y ya podemos crear la clase cliente:
package clienteconversor; import webservices.Conversor; import webservices.ConversorService; public class ClienteConversor { /** * @param args the command line arguments */ public static void main(String[] args) { ConversorService cs = new ConversorService(); Conversor c = cs.getConversorPort(); System.out.println("12.5 euros son " + c.eurosApesetas(12.5) + " pesetas"); } }

La ejecucin :
12.5 euros son 2079.825 pesetas

Crear un servicio web desde NetBeans En primer lugar debemos crear un proyecto de tipo Aplicacin Web.

En el siguiente paso deberemos seleccionar el servidor web que vamos a emplear. Si no hay ninguno configurado, pulsamos sobre Add :

La ubicacin del servidor:

Especificamos el dominio y las credenciales del administrador:

Con ello ya tenemos configurado el servidor:

Y ya podemos pulsar sobre Finish. Ahora en la aplicacin Web deberemos emplear el asistente para crear un servicio web :

En este caso se nos da el esqueleto de la clase del servicio web con anotaciones para que nosotros la completemos: package calculadoraws;
import javax.jws.WebService; import javax.jws.WebMethod; import javax.jws.WebParam; /** * * @author ichueca */ @WebService(serviceName = "CalculadoraWS") public class CalculadoraWS { /** This is a sample web service operation */ @WebMethod(operationName = "hello") public String hello(@WebParam(name = "name") String txt) { return "Hello " + txt + " !"; } }

Sustituimos el cdigo por :


@WebService(serviceName = "CalculadoraWS") public class CalculadoraWS { @WebMethod(operationName = "suma") public int suma(@WebParam(name = "numero1") int n1, @WebParam(name = "numero2") int n2) { return n1 + n2;

} @WebMethod(operationName = "resta") public int resta(@WebParam(name = "numero1") int n1, @WebParam(name = "numero2") int n2) { return n1 - n2; } }

Y ya slo resta ejecutar la aplicacin.

Potrebbero piacerti anche