Ejercicios de Invocación de Servicios Web


1. Vamos a ver cómo implementar un cliente para el servicio HolaMundo paso a paso. Vamos a crear un stub estático para nuestro cliente. El cliente se puede encontrar implementado en el directorio HolaMundoCliente de las plantillas de la sesión. A continuación se muestran los pasos que serían necesarios para la creación del cliente:

import es.ua.j2ee.sw.hola.*;

public class Cliente {
public static void main(String[] args) { if (args.length != 1) {
System.err.println("Uso: ant run -Dnombre=<nombre>");
System.exit(-1);
}

try { HolaMundoIF hola = creaProxy(); System.out.println(hola.saluda(args[0])); } catch (Exception e) { e.printStackTrace(); } }

private static HolaMundoIF creaProxy() { return (HolaMundoIF)(new HolaMundo_Impl().getHolaMundoIFPort()); } }

La función creaProxy() es la que se encarga de obtener el stub para acceder al servicio. El resto del código lo único que hace es acceder al servicio mediante el stub, de igual forma que si estuviese accediendo a un método de una clase Java de forma ordinaria

2. Realizar un cliente para el servicio de conversión euro-ptas. Seguir lo mismos pasos que en el ejercicio anterior, esta vez para desarrollar un cliente para el servicio de conversión entre euros y ptas desarrollado en la sesión anterior.

El cliente deberá tomar como parámetro un valor numérico en euros. Como resultado nos deberá mostrar a cuántas ptas corresponde dicha cantidad utilizando nuestro Servicio Web.

3. (OPTATIVO) Crear un cliente para el servicio del foro creado en la sesión anterior. La aplicación cliente nos deberá permitir publicar nuevos mensajes en el foro y consultar la lista de todos los mensajes publicados.

4. Vamos a desarrollar clientes para varios servicios de demostración ofrecidos por XMethods. Para ello deberemos acceder a:

http://www.xmethods.net

Para consultar la información sobre los servicios que ofrece y obtener el documento WSDL que necesitamos para crear nuestros clientes.

a) Cliente para el servicio de cambio de moneda (Currency Exchange Rate). Tenemos los ficheros correspondientes a este cliente ya implementado en el directorio CambioMonedaCliente de los ejercicios de la sesión. Para construirlo hemos seguido los siguientes pasos:

import es.ua.j2ee.sw.exchange.*;
   
public class Cliente {
  public static void main(String[] args) {

if(args.length < 2) { System.out.println(
"Uso: ant run -Dorigen=<pais_origen> -Ddestino=<pais_destino>");
System.exit(-1);
} try { CurrencyExchangePortType serv = creaProxy();
float divisa = serv.getRate(args[0], args[1]); System.out.println("Cambio de " + args[0] + " a " + args[1] + " = " + divisa); } catch (Exception e) { e.printStackTrace(); } } private static CurrencyExchangePortType creaProxy() { return (CurrencyExchangePortType)(new
CurrencyExchangeService_Impl().getCurrencyExchangePort()); } }
Cambio de usa a euro = 0.9424

b) Consulta de la temperatura en EEUU, a partir del código postal (Weather - Temperature). Seguir los pasos del punto anterior para desarrollar este cliente. Como parámetro deberá tomar el código postal del área de la cual queremos obtener la temperatura.

Nos debería devolver algo como:

La temperatura en 54124 es 60.0

5. (OPTATIVO) Crear un cliente para el servicio web de Google. Para poder acceder al servicio de Google deberás registrarte previamente y obtener una clave, que deberás proporcionar al invocar el servicio. Puede obtener esta clave gratuitamente en la siguiente dirección:

http://www.google.com/apis/

Desde esta página también puedes obtener documentación, ejemplos y librerías para utilizar estos servicios web.

a) Crear el cliente del servicio de Google generando el stub a partir de su documento WSDL:

http://api.google.com/GoogleSearch.wsdl

b) Ejecutar el cliente para realizar una búsqueda en Google. Los parámetros que debemos especificar en la llamada al servicio son los siguientes:

doGoogleSearch(clave, cadBusqueda, 0, 10, true, 
"", false, "", "UTF8", "UTF8");

Comprobar que el cliente funciona correctamente.

Ejercicio final de Servicios Web

1. Tienda de DVDs. Nuestro negocio consiste en una tienda que vende películas en DVD a través de Internet. Para dar una mayor difusión a nuestro catálogo de películas, decidimos implantar una serie de Servicios Web para acceder a información sobre las películas que vendemos.

De cada película ofreceremos información sobre su título, su director y su precio. Esta información podemos codificarla en una clase DatosPelicula como la siguiente:

public class DatosPelicula {
  public String titulo;
  public String director;
  public float precio;
   
  public DatosPelicula() {}
   
  public DatosPelicula(String titulo, String director, float precio) {
    this.titulo = titulo;
    this.director = director;
    this.precio = precio;
  }

  public String toString() {
return titulo + ", " + director + ", " + precio + " euros."; } }

Vamos a permitir que se busquen películas proporcionando el nombre de su director. Por lo tanto, el servicio ofrecerá una operación como la siguiente:

DatosPelicula [] buscaPorDirector(String director)

Proporcionaremos el nombre del director, y nos devolverá la lista de películas disponibles dirigidas por este director.

En un principio, podemos crear una lista estática de películas dentro del código de nuestro servicio, como por ejemplo:

DatosPelicula [] peliculas = { 
  new DatosPelicula("Mulholland Drive", "David Lynch", 26.96f),    
  new DatosPelicula("Carretera perdida", "David Lynch", 18.95f),    
  new DatosPelicula("Twin Peaks", "David Lynch", 46.95f), 
  new DatosPelicula("Telefono rojo", "Stanley Kubrick", 15.95f),    
  new DatosPelicula("Barry Lyndon", "Stanley Kubrick", 24.95f),    
  new DatosPelicula("La naranja mecánica", "Stanley Kubrick", 22.95f)
};

Se pide:

a) Implementar el servicio.

Para construir una lista con las películas cuyo director coincida con el nombre del director que se ha solicitado, podemos utilizar un código similar al siguiente, donde se ha proporcionado un parámetro director:

director = director.toLowerCase();
   
ArrayList list = new ArrayList();
   
for(int i=0;i<peliculas.length;i++)    {
  if(peliculas[i].director.toLowerCase().indexOf(director) != -1) {
    list.add(peliculas[i]);
  }
}
   
DatosPelicula [] result = new DatosPelicula[list.size()];
list.toArray(result);
   
return result;

b) Crear un cliente para este servicio. El cliente debe tomar como argumento el nombre del director por el cual queremos realizar la búsqueda, y nos mostrará una lista de las películas de dicho director, indicando el título y el precio de cada una de ellas, accediendo al servicio web para obtener la información.