Web Services: Primeros Pasos


(Imagen: Rembrandt - Artista en su estudio)

Para compilar y desplegar Web Services con Java, lo único que necesitamos es descargar la Java Stantard Edition 6 (o superior). Java 6 soporta JAX-WS (Java API for XML Web Services), la cúal a su vez soporta servicios basados en SOAP y de estilo REST.

Un Web Service basado en SOAP puede implementarse en una clase Java, pero debería existir una interfaz que declare los métodos (operaciones del Web Service) y una implementación que defina estos métodos. A la interfaz la llamaremos SEI (Service Endpoint Interf ace), y a la implementación la llamaremos SIB (Service Implementation Bean). El SIB puede ser un POJO, o un EJB.

Ahora, vemos como es una SEI:

package ch01.ts;
import javax.jws.webService;
import javax.jws.WebMethod;

import javax.jws.soap.SOAPBinding;

import javax.jws.soap.SOAPBinding.Style;


@WebService
@SOAPBinding (style= Style.RPC)

public interface TimeServer{
@WebMethod String getTimeAsString();
@WebMethod long getTimeAsElapsed();
}


Aquí, la anotación @WebService nos indica que se trata de una SEI. La anotación @WebMethod nos señala que cada método es una operación del Web Service. La anotación @SOAPBinding tiene impacto sobre la construcción del contrato del servicio: el documento WSDL (Web Services Definition Language). Style.RPC simplifica este contrato, y con ello el despliegue. Ahora, conozcamos al SIB:

package ch01.ts;

import java.util.Date;

import javax.jws.WebService;


@WebService(endpointInterface= "ch01.ts.TimeServer")
public class TimeServerImpl implements TimeServer{
public String getTimeAsString{ return new Date().toString();}
public long getTimeAsElapsed() {return new Date().getTime();}

}

La propiedad endpointInterface de la anotación @WebService enlaza el SIB (TimeServerImpl ) junto a la SEI correspondiente (TimeServer). Nótese que las implementaciones de los métodos no están anotadas como @WebMethods.

Para desplegar la aplicación, compilamos los archivos Java; y como se trata de un ejemplito inofensivo usamos una clase Java para su publicación (en la vida real se utilizaría un servidor de aplicaciones):

package ch01.ts;
import javax.xml.ws.Endpoint;
public class TimeServerPublisher{
public static voiud main(String [] args){ Endpoint.publish("http://127.0.0.1:9876/ts", new TimeServerImpl()); }
}


Con esta clasecita, publicamos el Web Service cuyo SIB es TimeServerImpl en la dirección 127.0.0.1 (localhost) y el puerto 9876, con ruta de publicación /ts. Utilizamos a la clase Endpoint y a su método publish, donde el primer argumento es el URL de publicación y el segundo una instancia del SIB del servicio. Para el ver el contrato del servicio (documento WSDL), bastaría compilar y ejecutar esta clase, y luego acceder al este URL : http://127.0.0.1:9876/ts?wsdl mediante un browser. Si todo salió bien, esto sería una parte de lo obtenido:



La sección portType de este documento WSDL (en negrita) agrupa las operaciones ofrecidas por el Web Service (getTimeAsString y getTimeAsElapsed), que se corresponden con los métodos declarados en el SEI e implementados en el SIB. El portType de un WSDL es como una interfaz Java, ya que nos muestra las operaciones del servicio pero no da detalles de la implementación. Cada operación del Web Service consiste en un mensaje input y un mensaje output. En tiempo de ejecución, cada mensaje es un documento SOAP. La otra sección en negrita es service, donde se observa que el atributo location es la URL de publicación. Este URL se denomina service endpoint, e informa a los clientes sobre donde pueden acceder al servicio.

El documento WSDL es útil para crear y ejecutar clientes para un web service. Para generar un cliente en base al WSDL , se puede usar la herramienta wsimport.

Basado en el capítulo 1 de Java Web Services: Up and Running de Martin Kalin

Publicar un comentario