lunes, 8 de octubre de 2012

Consumir servicios web con el Plugin WS-Client

En la entrada anterior veíamos cómo exponer servicios web a través del Plugin CXF de Grails de una manera rápida y sencilla. Ahora nos toca ver cómo consumir un servicio web de un tercero.
Para consumir servicios web, usaremos el Plugin WS-Client basado en GroovyWS.
Lo primero de todo instalaremos el plugin añadiendo esta linea en tu BuildConfig,
compile ":ws-client:1.0"

Ahora sólo tendremos que crear un controlador para consumir ese servicio web con la url del WSDL donde esté publicado.
import org.grails.plugins.wsclient.service.WebService

class ClienteController {
    WebService webService

    def index = {
        def wsdlUrl = "http://ejemplo.com/services/pruebas?wsdl"
        def proxy = webService.getClient(wsdlUrl)
        
        String resul = proxy.saluda("Eylen")
        ...
    }
}
En este ejemplo sólo se ejecuta el método "saluda" del WSDL donde se construye un XML de entrada con un sólo nivel de tipo String y nos devuelve un XML de salida con un sólo nivel también de tipo String.
Habrá XML de salida muchos más complicados que éste, donde habrá que ir navegando por los diferentes niveles consultando la información.
import org.grails.plugins.wsclient.service.WebService

class ClienteController {
    WebService webService

    def index = {
        def wsdlUrl = "http://ejemplo.com/services/pruebas?wsdl"
        def proxy = webService.getClient(wsdlUrl)
        
        def libros = proxy.getLibros()
        libros.libro.each{
           println it.campo
        }
        ...
    }
}
También se puede dar la situación en la que tenemos que construir un XML de entrada con más niveles. Esto se hace construyendo proxies. Tened cuidado con los namespace de los WSDL que puede dar más de un dolor de cabeza. Y también prestad atención si la entrada del WSDL es de tipo String o es una lista.
import org.grails.plugins.wsclient.service.WebService

class ClienteController {
    WebService webService

    def index = {
        def wsdlUrl = "http://ejemplo.com/services/pruebas?wsdl"
        def proxy = webService.getClient(wsdlUrl)

        def libro = proxy.create("defaultnamespace.Libro")

        libro.titulo= "Groovy in Action"
        libro.autor = "Dierk"
        libro.isbn = "123"

        //Detalles es una lista!!!
        def detalle1 = proxy.create("defaultnamespace.Detalles")       
        detalle1.paginas = "150"
        detalle1.indice = "S" 
        libro.detalles << detalle1

        proxy.addLibro(libro)
        ...
    }
}
Para poder debuguear en todos estas construcciones, es mejor que tengais puesto en el Config,
log4j = {
    …
    debug  'org.apache.cxf'
}
Como nota final decir que si teneis instalados en el mismo proyecto los plugins ws-client y cxf puede haber conflictos con la librería cxf. Se recomienda instalar primero el CXF y luego el WS-CLIENT y eliminar de ésta última el jar cxf.

No hay comentarios:

Publicar un comentario