Una vez creado nuestro paquete con la aplicación Java para interactuar con los servicios web como hemos visto en la lección anterior, vamos a realizar las tareas que habíamos dicho paso por paso. Es decir, vamos a crear un servicio web con una operación para añadir un usuario con su nombre de usuario, password, un nombre de piloto y una nave con su cantidad de armamento, otro para obtener una lista de usuarios con pilotos y naves y otro para hacer un login con usuario y password, para ello:
CREAR DIRECTORIO DE XML:
CREAR SERVICIO WEB
CREAR OPERACIÓN PARA AÑADIR UN USUARIO CON SUS PILOTOS Y SUS NAVES ASOCIADAS
@WebMethod(operationName = "crearUsuarioConPilotosYnaves") public Long crearUsuarioConPilotosYnaves(@WebParam(name = "datos_usuario") Usuario datos_usuario, @WebParam(name = "datos_piloto") Piloto datos_piloto, @WebParam(name = "datos_nave") Viper datos_nave) { if (nexus.obtenerUsuario(datos_usuario.getUsuario())!=null ){ //El usuario ya existe, salir! return new Long(-1); } //Añadir Viper Viper v = null; try { //Buscar viper: v = nexus.obtenerViper(datos_nave.getNombre()); } catch (ViperNoEncontradoException ex){ //La nave no existe, la añadimos v = new Viper(datos_nave.getNombre()); v.setArmamento(datos_nave.getArmamento()); } finally { //En otro caso, la nave es la misma? if (!v.getId().equals(datos_nave.getId())){ //No es la misma, error return new Long(-1); } } //Añadir piloto: Piloto p = null; try { p = nexus.obtenerPiloto(datos_piloto.getId()); } catch (PilotoNoEncontradoException ex){ //NO Existe el piloto, crearlo p = new Piloto(datos_piloto.getNombre(), datos_piloto.getDestreza(), v.getId()); nexus.guardarPiloto(p); } finally { //El piloto existe, tiene la misma ID? if (!p.getId().equals(datos_piloto.getId())){ return new Long(-1); } } ArrayList<Long> lista_pilotos = new ArrayList<Long>(); lista_pilotos.add(p.getId()); //Añadir el usuario con los datos almacenados ya en Nexus: Usuario u = new Usuario( datos_usuario.getUsuario(), datos_usuario.getPassword(), lista_pilotos ); nexus.guardarUsuario(u); return u.getId(); }
Para probarla primero hacemos click con el segundo botón del ratón en el proyecto Excalibur > Deploy ,esto instalará la aplicación web con la nueva operación compilada, ahora vamos a la lista de servicios web y pulsamos en test Web Service, ya podemos añadir usuarios con un piloto y una nave
CREAR OPERACIÓN PARA HACER UN LOGIN CON USUARIO Y PASSWORD
@WebMethod(operationName = "hacerLogin") public String operation(@WebParam(name = "usuario") String nombre_usuario, @WebParam(name ="password") String contrasena) { //TODO write your implementation code here: Usuario u = nexus.obtenerUsuario(nombre_usuario); if (u==null) return "El usuario no existe"; else if (u.getPassword().equals(contrasena)){ return "Acceso concedido"; } else { return "Contraseña inválida"; } }
Recordar que para testear los servicios podemos hacerlo en SOAP UI:
CREAR OPERACIÓN PARA OBTENER UN LISTADO DE USUARIOS
public List<Usuario> listadoUsuarios() { List<Usuario> listado = null; for (Iterator<Usuario> iter = nexus.listarUsuarios(); iter.hasNext(); ){ listado.add(iter.next()); } return listado; }
Buenas prácticas de programación: Los servicios web son un tipo de comunicación, añadir lógica de programación resulta en algo no-generalizable y por lo tanto ,no reutilizable. Resumiento: hay que hacer una conversión de los datos de un modelo de datos en un modelo de datos de un servicio web,i.e.,las clases con su lógica de programación en Java a un modelo del servicio y luego el paso inverso. Entre medias están las páginas web u otros clientes que los utilizan con su propia lógica. Por ello se recomienda diseñar los servicios web lo último, cuando ya tenemos todo lo que necesitamos en cuanto a datos y lógica interna con ellos, separar cada fichero WSDL para cada servicio es recomendable por si necesitamos cambiar algo y nos cuesta menos trabajo.
CREAR CLIENTES PARA CONECTARSE A LOS SERVICIOS WEB
< Volver al curso de Arquitectura de Servicios Web con JAVA y PHP