sesion01-apuntes

46
Introducción a los Servicios Web. Invocación de servicios web SOAP. Índice 1 ¿Qué es un Servicio Web?............................................................................................ 2 2 Características de los Servicios Web............................................................................ 3 3 Tipos de servicios Web................................................................................................ 3 4 Arquitectura de los Servicios Web............................................................................... 4 5 Servicios Web SOAP y Java EE.................................................................................. 5 6 Tecnologías básicas para Servicios Web...................................................................... 7 6.1 SOAP....................................................................................................................... 7 6.2 WSDL...................................................................................................................... 9 6.3 UDDI......................................................................................................................13 7 Interoperabilidad de los WS: Metro y JAX-WS........................................................ 14 8 Los servicios Web desde la vista del Cliente............................................................. 15 9 Ficheros WSDL y de esquema con Netbeans............................................................ 16 10 Tipos de acceso para invocar servicios Web JAX-WS.............................................23 11 Invocación de servicios web JAX-WS con JDK 1.6................................................ 24 12 Invocación de servicios web JAX-WS desde una clase Java con Maven................ 25 13 Invocación de servicios web JAX-WS desde una aplicación Web con Maven........31 14 Invocación de servicios web con Netbeans.............................................................. 37 15 Gestor de servicios web de Netbeans....................................................................... 41 16 Interfaz de invocación dinámica (DII)...................................................................... 43 16.1 A partir de un documento WSDL........................................................................ 44 16.2 Sin un documento WSDL.................................................................................... 45 Copyright © 2012-2013 Dept. Ciencia de la Computación e IA All rights reserved.

description

ok

Transcript of sesion01-apuntes

  • Introduccin a los Servicios Web.Invocacin de servicios web SOAP.

    ndice1 Qu es un Servicio Web?............................................................................................22 Caractersticas de los Servicios Web............................................................................33 Tipos de servicios Web................................................................................................ 34 Arquitectura de los Servicios Web...............................................................................45 Servicios Web SOAP y Java EE.................................................................................. 56 Tecnologas bsicas para Servicios Web......................................................................7

    6.1 SOAP....................................................................................................................... 76.2 WSDL...................................................................................................................... 96.3 UDDI......................................................................................................................13

    7 Interoperabilidad de los WS: Metro y JAX-WS........................................................ 148 Los servicios Web desde la vista del Cliente............................................................. 159 Ficheros WSDL y de esquema con Netbeans............................................................ 1610 Tipos de acceso para invocar servicios Web JAX-WS.............................................2311 Invocacin de servicios web JAX-WS con JDK 1.6................................................ 2412 Invocacin de servicios web JAX-WS desde una clase Java con Maven................ 2513 Invocacin de servicios web JAX-WS desde una aplicacin Web con Maven........3114 Invocacin de servicios web con Netbeans.............................................................. 3715 Gestor de servicios web de Netbeans....................................................................... 4116 Interfaz de invocacin dinmica (DII)......................................................................43

    16.1 A partir de un documento WSDL........................................................................ 4416.2 Sin un documento WSDL.................................................................................... 45

    Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • El diseo del software tiende a ser cada vez ms modular. Las aplicaciones se componende una serie de componentes (servicios) reutilizables, que pueden encontrarse distribuidosa lo largo de una serie de mquinas conectadas en red.

    Los Servicios Web nos permitirn distribuir nuestra aplicacin a travs de Internet,pudiendo una aplicacin utilizar los servicios ofrecidos por cualquier servidor conectadoa Internet. La cuestin clave cuando hablamos de servicios Web es la interoperabilidadentre las aplicaciones.

    1. Qu es un Servicio Web?

    Un Servicio Web es un componente al que podemos acceder mediante protocolos Webestndar, utilizando XML para el intercambio de informacin.

    Normalmente nos referimos con Servicio Web a una coleccin de procedimientos(mtodos) a los que podemos llamar desde cualquier lugar de Internet o de nuestraintranet, siendo este mecanismo de invocacin totalmente independiente de la plataformaque utilicemos y del lenguaje de programacin en el que se haya implementadointernamente el servicio.

    Cuando conectamos con un servidor web desde nuestro navegador, el servidor nosdevuelve la pgina web solicitada, que es un documento que se mostrar en el navegadorpara que lo visualice el usuario, pero es difcilmente entendible por una mquina.Podemos ver esto como web para humanos. En contraposicin, los Servicios Web ofreceninformacin con un formato estndar que puede ser entendido fcilmente por unaaplicacin. En este caso estaramos ante una web para mquinas.

    Los servicios Web son componentes de aplicaciones distribuidas que estn disponibles deforma externa. Se pueden utilizar para integrar aplicaciones escritas en diferenteslenguajes y que se ejecutan en plataformas diferentes. Los servicios Web sonindependientes de lenguaje y de la plataforma gracias a que los vendedores han admitidoestndares comunes de Servicios Web.

    El WC3 (World Wide Web Consortium) define un servicio Web como un sistemasoftware diseado para soportar interacciones mquina a mquina a travs de la red.Dicho de otro modo, los servicios Web proporcionan una forma estandar de interoperarentre aplicaciones software que se ejecutan en diferentes plataformas. Por lo tanto, suprincipal caracterstica su gran interoperabilidad y extensibilidad as como porproporcionar informacin fcilmente procesable por las mquinas gracias al uso de XML.Los servicios Web pueden combinarse con muy bajo acoplamiento para conseguir larealizacin de operaciones complejas. De esta forma, las aplicaciones que proporcionanservicios simples pueden interactuar con otras para "entregar" servicios sofisticadosaadidos.

    Historia de los servicios Web

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    2Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • Los servicios Web fueron "inventados" para solucionar el problema de la interoperabilidadentre las aplicaciones. Al principio de los 90, con el desarrollo de Internet/LAN/WAN, apareciel gran problema de integrar aplicaciones diferentes. Una aplicacin poda haber sidodesarrollada en C++ o Java, y ejecutarse bajo Unix, un PC, o un computador mainframe. Nohaba una forma fcil de intercomunicar dichas aplicaciones. Fu el desarrollo de XML el quehizo posible compartir datos entre aplicaciones con diferentes plataformas hardware a travs dela red, o incluso a travs de Internet. La razn de que se llamasen servicios Web es que fuerondiseados para residir en un servidor Web, y ser llamados a travs de Internet, tpicamente viaprotocolos HTTP, o HTTPS. De esta forma se asegura que un servicio puede ser llamado porcualquier aplicacin, usando cualquier lenguaje de programacin, y bajo cualquier sistemaoperativo, siempre y cundo, por supuesto, la conexin a Internet est activa, y tenga un puertoabierto HTTP/HTTPS, lo cual es cierto para casi cualquier computador que disponga de acceso aInternet.

    2. Caractersticas de los Servicios Web

    Las caractersticas deseables de un Servicio Web son: Un servicio debe poder ser accesible a travs de la Web. Para ello debe utilizar

    protocolos de transporte estndares como HTTP, y codificar los mensajes en unlenguaje estndar que pueda conocer cualquier cliente que quiera utilizar el servicio.

    Un servicio debe contener una descripcin de s mismo. De esta forma, unaaplicacin podr saber cul es la funcin de un determinado Servicio Web, y cul essu interfaz, de manera que pueda ser utilizado de forma automtica por cualquieraplicacin, sin la intervencin del usuario.

    Debe poder ser localizado. Deberemos tener algn mecanismo que nos permitaencontrar un Servicio Web que realice una determinada funcin. De esta formatendremos la posibilidad de que una aplicacin localice el servicio que necesite deforma automtica, sin tener que conocerlo previamente el usuario.

    3. Tipos de servicios Web

    A nivel conceptual, un servicio es un componente software proporcionado a travs de unendpoint accesible a travs de la red. Los servicios productores y consumidores utilizanmensajes para intercambiar informacin de invocaciones de peticin y respuesta en formade documentos auto-contenidos que hacen muy pocas asunciones sobre las capacidadestecnolgicas de cada uno de los receptores.

    Definicin de endpointLos servicios pueden interconectarse a travs de la red. En una arquitectura orientada a servicios,cualquier interaccin punto a punto implica dos endpoints: uno que proporciona un servicio, yotro de lo consume. Es decir, que un endpoint es cada uno de los "elementos", en nuestro casonos referimos a servicios, que se sitan en ambos "extremos" de la red que sirve de canal decomunicacin entre ellos. Cuando hablamos de servicios Web, un endpoint se especificamediante una URI.

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    3Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • A nivel tcnico, los servicios pueden implementarse de varias formas. En este sentido,podemos distinguir dos tipos de servicios Web: los denominados servicios Web "grandes"("big" Web Services), los llamaremos servicios Web SOAP, y servicios Web RESTful.Servicios Web SOAPLos servicios Web SOAP, o servicios Web "big", utilizan mensajes XML paraintercomunicarse que siguen el estndar SOAP (Simple Object Access Protocol), unlenguaje XML que define la arquitectura y formato de los mensajes. Dichos sistemasnormalmente contienen una descripcin legible por la mquina de la descripcin de lasoperaciones ofrecidas por el servicio, escrita en WSDL (Web Services DescriptionLanguage), que es un lenguaje basado en XML para definir las interfaces sintcticamente.El formato de mensaje SOAP y el lenguaje de definicin de interfaces WSDL se haextendido bastante, y muchas herramientas de desarrollo, por ejemplo Netbeans, puedenreducir la complejidad de desarrollar aplicaciones de servicios Web.El diseo de un servicio basado en SOAP debe establecer un contrato formal paradescribir la interfaz que ofrece el servicio Web. WSDL puede utilizarse para describir losdetalles del contrato, que pueden incluir mensajes, operaciones, bindings, y lalocalizacin del servicio Web. Tambin deben tenerse en cuenta los requermientos nofuncionales, como por ejemplo las transacciones, necesidad de mantener el estado(addressing), seguridad y coordinacinEn este mdulo vamos a hablar nicamente en los Servicios Web SOAP.

    Servicios Web RESTfulLos servicios Web RESTful (Representational State Transfer Web Services) sonadecuados para escenarios de integracin bsicos ad-hoc. Dichos servicios Web se suelenintegrar mejor con HTTP que los servicios basado en SOAP, ya que no requierenmensajes XML o definciones del servicio en forma de fichero WSDLLos servicios Web REST utilizan estndares muy conocidos como HTTP, SML, URI,MIME, y tienen una infraestructura "ligera" que permite que los servicios se construyanutilizando herramientas de forma mnima. Gracias a ello, el desarrollo de serviciosRESTful es barato y tiene muy pocas "barreras" para su adopcin.

    4. Arquitectura de los Servicios Web

    Los servicios Web presentan una arquitectura orientada a servicios que permite crear unadefinicin abstracta de un servicio, proporcionar una implementacin concreta de dichoservicio, publicar y localizar un servicio, seleccionar un instancia de un servicio, y utilizardicho servicio con una elevada interoperabilidad. Es posible desacoplar laimplementacin del servicio Web y su uso por parte de un cliente. Tambin es posibledesacoplar la implementacin del servicio y de cliente. Las implementaciones concretas

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    4Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • del servicio pueden desacoplarse a nivel de lgica y transporte. La siguiente figuramuestra el diagrama de una arquitectura orientada a servicios.

    Arquitectura orientada a Servicios

    El proveedor del servicio define la descripcin abstracta de dicho servicio utilizando unlenguaje de descripcin de Servicios Web (WSDL: Web Services Description Language:). A continuacin se crea un Servicio concreto a partir de la descripcin abstracta delservicio, produciendo as una descripcin concreta del servicio en WSDL. Dichadescripcin concreta puede entonces publicarse en un servicio de registro como porejemplo UDDI (Universal Description, Descovery and Integration). Un cliente de unservicio puede utilizar un servicio de registro para localizar una descripcin de unservicio, a partir de la cual podr seleccionar y utilizar una implementacin concreta dedicho servicio.

    La descripcin abstracta se define en un documento WSDL como un PortType. Unainstancia concreta de un Servicio se define mediante un elemento port de un WSDL(consistente a su vez en una combinacin de un PortType, un binding de codificacin ytransporte, ms una direccin). Un conjunto de ports definen un elemento service de unWSDL.

    5. Servicios Web SOAP y Java EE

    Como ya se ha dicho, en este mdulo vamos a centrarnos en los servicios Web SOAP.Aunque no existe una definicin comnmente aceptada para este tipo de servicios,utilizaremos la siguiente extraida de la especificacin JSR-109 (Implementing WebServices), que define el modelo de programacin y arquitectura del soporte de ejecucin(run-time) para implementar servicios Web en Java.Definicin de Servicio Web:Un servicio Web es un componente con las siguientes caractersticas: Implementa los mtodos de una interfaz descrita mediante un WSDL. Dichos mtodos

    se implementan utilizando un EJB de sesin de tipo Stateless/Singleton o bien un

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    5Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • componente web JAX-WS Un servicio Web puede tener publicada su interfaz en uno o ms "registros" durante

    su despliegue La implementacin de un Servicio Web, la cual utiliza solamente la funcionalidad

    descrita por su especificacin, puede desplegarse en cualquier servidor deaplicaciones que cumple con las especificaciones Java EE

    Los servicios requeridos en tiempo de ejecucin (run-time), tales como atributos deseguridad, se separan de la implementacin del servicio. Se utilizarn herramientasadicionales que pueden definir dichos requerimientos durante el ensamblado odespliegue

    Un contenedor acta como mediador para acceder al servicio

    La especificacin de Java EE para servicios Web define una serie de relacionesarquitectnicas requeridas para dichos servicios, que mostramos en la siguiente figura. Setrata de relaciones lgicas que no imponen requerimiento alguno para el proveedor delcontenedor sobre cmo estructurar los contenedores y los procesos. Como aadido para laplataforma Java EE se incluye un componente port que depende de la funcionalidad decontenedor proporcionada por los contenedores web y EJB, y del transporteSOAP/HTTP.

    Arquitectura Java EE

    Los servicios Web para Java EE requieren que un componente Port pueda serreferenciado desde un cliente, as como desde los contenedores web y EJB. No serequiere que haya un Port accesible desde un contenedor de applets.

    Los servicios Web para Java EE pueden implementarse de dos formas: como una claseJava que se ejecuta en un contenedor Web (segn el modelo de programaci definido enJAX-WS, y que veremos ms adelante), o como un EJB de sesin stateless o singleton enun contenedor EJB.

    El contenedor del servicio Web debe proporcionar la gestin del ciclo de vida de laimplementacin del servicio, adems de proporcionar soporte adicional para la gestin de

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    6Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • concurrencia de la invocacin de los mtodos del servicio, y soporte para la seguridad.

    6. Tecnologas bsicas para Servicios Web

    Tenemos una serie de tecnologas, todas ellas basadas en XML, que son fundamentalespara el desarrollo de Servicios Web. Estas tecnologas son independientes tanto del SOcomo del lenguaje de programacin utilizado para implementar dichos servicios. Por lotanto, sern utilizadas para cualquier Servicio Web, independientemente de la plataformasobre la que construyamos dichos servicios (como puede ser J2EE o .NET).Los protocolos utilizados en los Servicios Web se organizan en una serie de capas:

    Capa Descripcin

    Transporte de servicios Es la capa que se encarga de transportar los mensajes entreaplicaciones. Normalmente se utiliza el protocolo HTTP para estetransporte, aunque los servicios web pueden viajar medianteotros protocolos de transferencia de hipertexto como SMTP, FTPo BEEP.

    Mensajera XML Es la capa responsable de codificar los mensajes en XML deforma que puedan ser entendidos por cualquier aplicacin.Puede implementar los protocolos XML-RPC o SOAP.

    Descripcin de servicios Se encarga de definir la interfaz pblica de un determinadoservicio. Est definicin se realiza mediante WSDL.

    Localizacin de servicios Se encarga del registro centralizado de servicios, permitiendoque estos sean anunciados y localizados. Para ello se utiliza elprotocolo UDDI.

    A continuacin vamos a hablar con un poco ms de detalle sobre las tecnologas demensajera, descripcin de servicios y localizacin. Ms concretamente nos referimos aSOAP, WSDL y UDDI.

    6.1. SOAP

    Se trata de un protocolo derivado de XML que nos sirve para intercambiar informacinentre aplicaciones.

    Normalmente utilizaremos SOAP para conectarnos a un servicio e invocar mtodosremotos, aunque puede ser utilizado de forma ms genrica para enviar cualquier tipo decontenido. Podemos distinguir dos tipos de mensajes segn su contenido: Mensajes orientados al documento: Contienen cualquier tipo de contenido que

    queramos enviar entre aplicaciones. Mensajes orientados a RPC: Este tipo de mensajes servir para invocar

    procedimientos de forma remota (Remote Procedure Calls). Podemos verlo como un

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    7Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • tipo ms concreto dentro del tipo anterior, ya que en este caso como contenido delmensaje especificaremos el mtodo que queremos invocar junto a los parmetros quele pasamos, y el servidor nos deber devolver como respuesta un mensaje SOAP conel resultado de invocar el mtodo.

    Puede ser utilizado sobre varios protocolos de transporte, aunque est especialmentediseado para trabajar sobre HTTP.Dentro del mensaje SOAP podemos distinguir los siguientes elementos:

    Elementos de un mensaje SOAP Un sobre (Envelope), que describe el mensaje, a quien va dirigido, y cmo debe ser

    procesado. El sobre incluye las definiciones de tipos que se usarn en el documento.Contiene una cabecera de forma opcional, y el cuerpo del mensaje.

    Una cabecera (Header) opcional, donde podemos incluir informacin sobre elmensaje. Por ejemplo, podemos especificar si el mensaje es obligatorio (debe serentendido de forma obligatoria por el destinatario), e indicar los actores (lugares pordonde ha pasado el mensaje).

    El cuerpo del mensaje (Body), que contiene el mensaje en si. En el caso de losmensajes RPC se define una convencin sobre como debe ser este contenido, en elque se especificar el mtodo al que se invoca y los valores que se pasan comoparmetros. Puede contener un error de forma opcional.

    Un error (Fault) en el cuerpo del mensaje de forma opcional. Nos servir para indicaren una respuesta SOAP que ha habido un error en el procesamiento del mensaje depeticin que mandamos.

    Hemos visto como los mensajes SOAP nos sirven para intercambiar cualquier documentoXML entre aplicaciones. Pero puede ocurrir que necesitemos enviar en el mensaje datosque no son XML, como puede ser una imagen. En ese caso tendremos que recurrir a laespecificacin de mensajes SOAP con anexos.Los mensajes SOAP con anexos aaden un elemento ms al mensaje:

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    8Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • Elementos de un mensaje SOAP con Anexos El anexo (Attachment), puede contener cualquier tipo de contenido (incluido el

    XML). De esta forma podremos enviar cualquier tipo de contenido junto a un mensajeSOAP.

    Nuestro mensaje podr contener tantos anexos como queramos.Un ejemplo de mensaje SOAP es el siguiente:

    Alicante

    En l estamos llamando a nuestro mtodo getTemperatura para obtener informacinmeteorolgica, proporcionando como parmetro el rea de la que queremos obtener latemperatura.

    Podemos encontrar la especificacin de SOAP y SOAP con anexos publicada en lapgina del W3C, en las direcciones http://www.w3.org/TR/SOAP/ yhttp://www.w3.org/TR/SOAP-attachments respectivamente.

    6.2. WSDL

    WSDL (Web Services Description Language) es un lenguaje basado en XML utilizadopara describir la funcionalidad que proporciona un servicio Web. Una descripcin WSDL(fichero WSDL) de un servicio web proporciona una descripcin entendible por lamquina (machine readable) de la interfaz del servicio Web, indicando cmo se debellamar al servicio, qu parmetros espera, y qu estructuras de datos devuelve.

    La versin actual de WSDL es la 2.0, en la que se ha cambiado el significado de la D por

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    9Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • Definition. La nueva versin plantea cambios de nomenclatura y estructura del ficheroxml que contiene la descripcin del servicio. En este mdulo vamos a utilizar la versinanterior, la 1.1, puesto que es la que est soportada actualmente por Netbeans, as comopor BPEL, que estudiaremos ms adelante. En la figura siguiente mostramos la estructuraque siguen los ficheros WSDL en ambas versiones, en donde podemos observar elcambio de nomenclatura en la versin 2.0.

    Estructura de un documento WSDL

    WSDL describe un servicio utilizando varios elementos (etiquetas xml). Dichoselementos podemos clasificarlos como abstractos o concretos.La parte WSDL abstractadescribe las operaciones y mensajes con detalle. En otras palabras, la parte abstracta de unWSDL especifica QU hace el servicio: Qu operaciones estn disponibles Qu entradas, salidas, y mensajes de error tienen las operaciones Cules son las definiciones de los tipos para los mensajes de entrada, salida y errorEn el mundo Java, podemos pensar en la parte abstracta de un WSDL como en ladefinicin de una interfaz o una clase abstracta, con la definicin de sus mtodos, pero nosus implementaciones. La parte abstracta de un WSDL contiene dos componentesprincipales: Las operaciones que forman la definicin de la interfaz Los tipos de datos para los parmetros de entrada, salida y error, de las operaciones

    La parte WSDL concreta describe el cmo y dnde del servicio: Cmo tiene que llamar un cliente al servicio Qu protocolo debera usar Dnde est disponible el servicio

    En el mundo Java podemos pensar en la parte concreta de un WSDL como en laimplementacin de la parte abstracta, aunque en trminos de servicios Web, solamentedescribe dnde se encuentra dicha implementacin para utilizarse. La parte concreta deun WSDL contiene dos componentes principales:

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    10Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • Informacin de enlazado (binding) sobre el protocolo a utilizar La direccin en donde localizar el servicio

    Vamos a ver con un poco ms de detalle los elementos WSDL (tanto la parte abstractacomo la concreta): definitions: Es el elemento raiz y permite especificar el espacio de nombres del

    documento target namespace, el nombre, y otros prefijos utilizados en el documentoWSDL. Un ejemplo de definicin de prefijo es:xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/". Este prefijo especifica que todos loselementos dentro del documento de esquemas con el target namespace"http://schemas.xmlsoap.org/wsdl/" tendrn el prefijo wsdl.

    types: Se utiliza para definir los tipos de datos que se intercambiarn en el mensaje.Podemos definir dichos tipos directamente dentro de este elemento, o importar ladefinicin de un fichero de esquema (fichero xsd). La definicin de tipos puede versecomo las definiciones Java de clase, con variables que pueden ser tipos primitivos oreferencias a otras clases u objetos. Los tipos primitivos se definen en los espacios denombres del Schema y normalmente nos referimos a ellos como built-in types. stosincluyen tipos simples tales como string, int, double,...

    message: Define los distintos mensajes que se intercambiaran durante el proceso deinvocacin del servicio. Se debern definir los mensajes de entrada y salida para cadaoperacin que ofrezca el servicio. Los mensajes muestran descripciones abstractas delos datos que se van a intercambiar.

    portType: Contiene una coleccin de una o ms operaciones. Para cada operacinindica cules son los mensajes de entrada y salida, utilizando para ello los mensajesdefinidos en el apartado anterior. Los portTypes son, por lo tanto, coleccionesabstractas de operaciones soportadas por un servicio

    binding: Indica el protocolo de red y el formato de los datos para las operaciones deun portType. Los bindings son definiciones concretas de los portTypes. Un portTypepuede tener mltiples bindings asociados. El formato de datos utilizado para losmensaje de las operaciones del portType puede ser orientado al documento uorientado a RPC. Si es orientado al documento tanto el mensaje de entrada como el desalida contendrn un documento XML. Si es orientado a RPC el mensaje de entradacontendr el mtodo invocado y sus parmetros, y el de salida el resultado de invocardicho mtodo, siguiendo una estructura ms restrictiva.

    service: Define el servicio como una coleccin de elementos port a los que se puedeacceder. Un port se define asociando una direccin de red con un binding, de losdefinidos en el documento. Dicha direccin de red es la direccin (URL) donde elservicio acta, y por lo tanto, ser la direccin a la que las aplicaciones debernconectarse para acceder al servicio.

    Un documento WSDL de ejemplo es el siguiente:

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    11Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • En este ejemplo se define un servicio, denominado HelloService. Dicho servicio estformado por el port HelloPort, al cual se accede con protocolo http (bindingtransport=http) y con mensajera soap con estilo document (bindingstyle=document). Dicho port proporciona la operacin (funcionalidad) sayHello(operation name= "sayHello"). Dicha operacin utiliza la codificacin literal en losmensajes de entrada y salida (body use= "literal"). Esto es lo que se conoce comooperacin de tipo document/literal.El elemento portType define la operacin sayHello a partir de los mensajes de entrada ysalida que la componen.

    En los elementos message vemos la descripcin de los mensajes de entrada y salida de laoperacin sayHello. El mensaje de entrada contiene un dato de tipo "tns:sayHello", y

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    12Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • el de salida es de tipo "tns:sayHelloResponse" (la cadena de saludo devuelta por elservicio). La definicin de los tipos se encuentra en el fichero de esquema referenciadopor la propiedad schemaLocation en una sub-etiqueta de

    Podemos encontrar la especificacin de WSDL 1.1 publicada en la pgina del W3C, en ladireccin http://www.w3.org/TR/wsdl.

    6.3. UDDI

    UDDI nos permite localizar Servicios Web. Para ello define la especificacin paraconstruir un directorio distribuido de Servicios Web, donde los datos se almacenan enXML. En este registro no slo se almacena informacin sobre servicios, sino tambinsobre las organizaciones que los proporcionan, la categora en la que se encuentran, y susinstrucciones de uso (normalmente WSDL). Tenemos por lo tanto 3 tipos de informacinrelacionados entre s: Pginas blancas: Datos de las organizaciones (direccin, informacin de contacto,

    etc). Pginas amarillas: Clasificacin de las organizaciones (segn tipo de industria, zona

    geogrfica, etc). Pginas verdes: Informacin tcnica sobre los servicios que se ofrecen. Aqu se dan

    las instrucciones para utilizar los servicios. Es recomendable que estas instruccionesse especifiquen de forma estndar mediante un documento WSDL.

    Adems, UDDI define una API para trabajar con dicho registro, que nos permitir buscardatos almacenados en l, y publicar datos nuevos.

    De esta forma, una aplicacin podr anunciar sus servicios en un registro UDDI, o bienlocalizar servicios que necesitemos mediante este registro.

    Esta capacidad de localizar servicios en tiempo de ejecucin, y de que una aplicacinpueda saber cmo utilizarlo inmediatamente gracias a la descripcin del servicio, nospermitir realizar una integracin dbilmente acoplada de nuestra aplicacin.

    La interfaz de UDDI est basada en SOAP. Para acceder al registro se utilizarn mensajesSOAP, que son transportados mediante protocolo HTTP.

    Podemos encontrar la especificacin de UDDI, documentacin, y ms informacin en ladireccin http://uddi.xml.org/.

    Estos registros se utilizan normalmente de forma interna en organizaciones para tener undirectorio organizado de servicios. Podemos encontrar varios registros proporcionadospor diferentes proveedores. Destacamos jUDDI, un registro open-source de Apache. Esteregistro consiste en una aplicacin web Java que puede instalarse en cualquier servidorcon soporte para este tipo de aplicaciones, como puede ser Tomcat, y una base de datos,que podr ser instalada en diferentes SGBD (MySQL, Postgres, Oracle, etc).

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    13Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • 7. Interoperabilidad de los WS: Metro y JAX-WS

    La interoperabilidad de los servicios Web constituye una iniciativa de Sun y Microsoft. Elprincipal objetivo es proporcionar productos que sean capaces de interoperar a travs dediferentes plataformas.

    Metro (http://metro.java.net) es el producto resultante de la iniciativa de Sun para lainteroperabilidad de los servicios Web utilizando la plataforma Java. De igual formaWCF (Windows Communication Foundation) es la aportacin de Microsoft para laplataforma .NET.

    Metro, por lo tanto, constituye la implementacin por parte de Sun, de la pila (coleccinde tecnologas) de servicios Web (web service stack). La versin actual es la 2.1.1 y estformada por tres componentes principales, que podemos ver en la figura que se adjunta: Metro/WSIT 2.1.1: WSIT es un conjunto de tecnologas (Web Services Interoperabe

    Technologies) que permiten la interoperabilidad con .NET. A nivel de transporte,Metro permite utilizar HTTP, MTOM, SOAP/TCP. Tambin proporciona fiabilidaden el envo de mensajes (Reliability), implementando las especificacionesWS-ReliableMessaging. Asmismo Metro permite habilitar el uso de transaccionesatmicas, para lo cual proporciona una implementacin de las especificacionesWS-Coordination y WS-Atomic Transaction. La seguridad tambin est contempladaen Metro mediante la implementacin de las especificaciones WS-Security yWS-Trust. Bootstrapping: WSDL; WS-Policy; WS-MetadataExange

    JAX-WS RI 2.2.5: Es la implementacin de referencia del estndar JAX-WS(especificacin JSR 224: Java API for XML-Based Web Services). Proporciona lascaractersticas bsicas para la interoperabilidad de los servicios Web (WS-I BasicProfile: mensajera SOAP, WSDL, publicacin de servicios en UDDI; WS-IAttachment Profile: utilizacin de SOAP con anexos; WS-I Addressing: utilizacin deespacios de nombres y ficheros de esquema)

    JAXB RI 2.2.4-1: Implementacin de referencia del API para la capa de enlazado dedatos (JAXB: Java Architecture for XML binding)

    Componentes de Metro

    Con JAX-WS, una invocacin de una operacin a un servicio web se representa con un

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    14Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • protocolo basado en XML, como por ejemplo SOAP. La especificacin SOAP define laestructura del "envoltorio" (envelope) del mensaje, reglas de codificacin, y convencionespara representar invocaciones y respuestas del servicio web. Estas llamadas y respuestasson transmitidas como mensajes SOAP (ficheros XML) a travs de HTTP.Si bien los mensajes SOAP son complejos, la API JAX-WS oculta esta complejidad aldesarrollador de la aplicacin. En la parte del servidor, el desarrollador especifica lasoperaciones del servicio web definiendo mtodos en una interfaz escrita en lenguaje Java.El desarrollador tambin codifica una o ms clases que implementan dichos mtodos. Losprogramas cliente tambin son fciles de codificar. Un cliente crea un proxy (un objetolocal que representa el servicio) y a continuacin simplemente invoca los mtodos sobreel proxy. Con JAX-WS, el desarrollador no necesita generar o "parsear" mensajes SOAP.El runtime de JAX-WS convierte las llamadas y respuestas del API en y desde losmensajes SOAP.La siguiente figura muestra la interaccin entre un cliente y un servicio web a travs deJAX-WS.

    Comunicacin entre un servicio Web y un cliente a travs de JAX-WS

    Metro (y consecuentemente, JAX-WS)est incluido en Glassfish 3.x por defecto, por loque haremos uso de l para implementar nuestros Servicios Web y clientescorrespondientes.

    8. Los servicios Web desde la vista del Cliente

    La vista del cliente de un servicio Web es bastante similar a la de un EnterpriseJavaBean. Un cliente de un servicio Web puede ser otro servicio Web, un componenteJava EE (componente web,componente EJB), incluyendo una aplicacion cliente Java EE,o una aplicacin Java arbitraria. Una aplicacin no Java o un servicio Web para unaaplicacin no Java EE tambin podran ser clientes de un Servicio Web, pero vamos aceirnos a la plataforma Java EE.

    El cliente de un servicio Web puede ser remoto (no se requiere que resida en la mismamquina que el servicio Web) y se proporciona una total transparencia al respecto (elcliente no puede distinguir si est accediendo a un servidor local o remoto).La siguiente figura ilustra la vista del cliente de un servicio Web, proporcionada por elproveedor del componente Port y el contenedor en el que ste reside. Adems se incluyela clase/interfaz Service (SI: Service Interface), y la interfaz del Endpoint del servicio(SEI: Service Endpoint Interface).

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    15Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • Vista de un cliente de un servicio Web

    La clase/interfaz Service (SI) define los mtodos que un cliente puede utilizar paraacceder a un Port de un servicio Web. Un cliente NO crea o destruye un Port. Utiliza laclase/interfaz Service para obtener el acceso a un Port. La clase/interfaz Service se defineen la especificacin JAX-WS, pero su comportamiento viene definido en el documentoWSDL proporcionado por el proveedor del servicio Web. Las herramientas de desplieguedel contenedor proporcionan una implementacin de los mtodos de la clase/interfazService generada por JAX-WS.

    El cliente accede a una implementacin de un servicio Web utilizando el SEI. Dicho SEIes especificado por el proveedor del servicio. Las herramientas del despliegue y elrun-time del contenedor proporciona las clases en la parte del servidor que van a atenderlas peticiones SOAP sobre la implementacin de dicho servicio de los mtodosespecificados en el SEI.

    Un Port no tiene identidad para el cliente, que lo debe considerar como un objeto sinestado.

    JAX-WS define un modelo de programacin en el que se realiza un mapeado de undocumento WSDL a Java. Dicho mapaeado proporciona una factora (Service) paraseleccionar qu Port (agregado en el servicio) desea usar el cliente. Como veremos msadelante, la herramienta JAX-WS que porporciona las clases necesarias en la parte delcliente para poder acceder a un servicio web se denomina wsimport. En general, eltransporte, codificacin, y direccin del Port son transparentes para el cliente. El clienteslamente necesita realizar llamadas sobre la interfaz del endpoint del servicio (ServiceEndpoint Interface), utilizando el PortType correspondiente para acceder a dicho servicio.En esta sesin vamos a explicar el modelo de programacin del cliente de un servicioWeb utilizando JAX-WS, pero antes vamos a ver cmo trabajar con ficheros wsdl yficheros de esquema con Netbeans.

    9. Ficheros WSDL y de esquema con Netbeans

    Saber "leer" y/o crear un fichero WSDL es importante para trabajar con servicios WebSOAP. Por ello vamos a ver cmo, de forma sencilla, se puede trabajar con ficherosWSDL y de esquema utilizando Netbeans

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    16Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • ImportantePara poder editar ficheros WSDL y de esquema aprovechando las ventajas de edicin que nosproporciona NetBeans, tenemos que instalar el plugin correspondiente.

    Cmo instalar el plugin en Netbeans para editar ficheros WSDL y xsdPara instalar el plugin, lo haremos desde el men de NetBeans. Para ello iremos aTools->Plugins->Settings->Add. A continuacin tenemos que proporcionar un nombre(para identificar el sitio que contiene los plugins, y aadirlo a la lista de sitios en dondeNetBeans buscar actualizaciones de los plugins), y la URL del sitio desde el cual nospodemos descargar e instalar el plugin. Name: Deadlock.Netbeans.org URL: http://deadlock.netbeans.org/hudson/job/xml/lastSuccessfulBuild/

    artifact/build/updates/updates.xml

    A continuacin pulsamos OK.

    URL de descarga del plugin XML

    En la pestaa "Available Plugins", marcaremos "XML Tools", y procedemos a suinstalacin:

    Instalacin del plugin XML

    FICHEROS DE ESQUEMAXML Schema es una recomendacin del W3C, que proporciona mecanismos para definirla estructra, contenido y semntica de un documento XML. Un fichero WSDL utiliza el

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    17Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • "lenguaje de esquemas" (XML Schema) para definir los tipos de datos y/o elementosutilizados por las operaciones de un servicio Web.

    El bloque de construccin principal de un documento XML es element. La definicin deun elemento element debe contener una propiedad name, que representa su nombre, y unapropiedad type para indicar el tipo de elemento. Podemos utilizar alguno de los tipospredefinidos (built-in types), por ejemplo xs:string, xs:integer, o bien podemos definirnuevos tipos utilizando etiquetas simpleType o complexType.

    Por ejemplo, podemos crear la siguiente definicin del elemento Customer_Addres querepresenta la direccin de un cliente:

    Ahora podemos utilizar la definicin anterior para expresar la estructura del siguientemensaje de respuesta de nuestro servicio Web

    Segn esto, un ejemplo de mensaje de respuesta por parte de nuestro servicio Web podraser ste:

    Calle de los Pinos, 37

    En lugar de utilizar tipos primitivos, podemos definir nuevos tipos utilizando la etiquetaComplexType (es un contenedor de elementos). Por ejemplo vamos a definir los tiposCustomerType y AddressType y el elemento Customer, la siguiente forma:

    Ahora podemos crear un segundo mensaje de respuesta en nuestro WSDL que haga usodel nuevo tipo CustomerInfo:

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    18Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • Un ejemplo de mensaje de respuesta con esta definicin podra ser:

    12345678Calle de los Pinos, 37Calle de los Manzanos, 25

    Para crear ficheros de esquema desde Netbeans, tenemos que crear un nuevo fichero conextensin xsd. Con botn derecho, seleccionamos New->Other->XML->XML Schema.Debemos proporcionar un nombre para nuestro fichero .xsd, por ejemplo MiEsquema.Vamos explicar como crear, de forma visual, el esquema anterior.

    El editor de ficheros de esquemas de Netbeans nos permite trabajar con tres vistas: lavista de fuentes (Source), en la que podemos trabajar directamente con xml, la vista deesquema (Schema): que nos muestra el contenido del fichero en forma de rbol, o enforma de "columnas", y la vista de diseo (Design). Esta ltima vista nos permite editarun fichero de esquema de forma visual, arrastrando componentes desde una paleta yeditando sus propiedades, de forma que con unos cuantos "clicks" de ratn Netbeansgenera el correspondiente cdigo xml, que podemos ver en la vista de fuentes. Las tresvistas estn sincronizadas en todo momento, de forma que los cambios en cualquiera deellas, se reflejarn automticamente en las otras dos.Vamos a crear el tipo CustomerType. Para ello tendremos que "arrastrar" con el botnizquierdo del ratn el componente ComplexType desde la paleta de componentes de laderecha, y situarlo justo debajo de Complex Types, en el editor de diseo. Cuando nossituemos con el ratn en el lugar correcto, nos aparecer una lnea en negro y sloentonces podremos "soltar" el dedo del ratn, y nos crear un nuevo elementoComplexType en la vista de diseo. Vamos a ponerle el nombre CustomerType. Siseleccionamos el componente, haciendo doble "click" sobre el mismo podemos cambiarel nombre del componente. Si seleccionamos el componente y pulsamos botn derecho,nos aparece un men, con la opcin "Properties" con el que podemos borrar, aadirelementos,..., y editar las propiedades del componente en cualquier momento.

    Arrastramos el componente ComplexType a la vista de diseo

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    19Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • A continuacin aadiremos un componente element a CustomerType, arrastrando dichocomponente desde la paleta hasta situarnos sobre CustomerType antes de soltar el dedodel ratn. Llamaremos al nuevo elemento "Phone". Seguidamente, con el botn derecho,elegimos la opcin "Properties" del men contextual, y pinchamos sobre el botn con trespuntos correspondiente al tem "Definition", y seleccionamos el tipo predefinido integer(dentro del grupo Built-In Types)

    Aadimos el elemento Phone a AddressType

    Repetimos los pasos anteriores para aadir un nuevo componente ComplexType al quellamaremos "AddressType", con los sub-elementos "Address1", y "Address2", ambas detipo "string".

    Para finalizar, crearemos un nuevo sub-elemento de "CustomerType", al que llamaremos"Addresses". En este caso, el tipo que asociaremos a dicho elemento ser el tipo"AddressType", dentro del grupo "Complex Types"

    Seleccionamos el tipo AddressType

    El resultado final en la vista de diseo debe ser ste:

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    20Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • Vista de diseo del esquema MiEsquema.xsd

    Si cambiamos a la vista de fuentes (Source) veremos lo siguiente:

    Vista de fuentes del esquema MiEsquema.xsd

    FICHEROS WSDLYa hemos explicado el contenido de un fichero WSDL. Netbeans nos permite crearficheros WSDL de forma "visual", simplificando de forma significativa el proceso deedicin de la especificacin WSDL de nuestro servicio web.

    Para crear un fichero wsdl con NetBeans, activamos el men contextual con el con botnderecho y seleccionamos New->Other->XML->WSDL Document. Podemos elegir entrecrear un documento WSDL abstracto o concreto. En el primer caso solamenteproporcionamos el portType y las operaciones que ofrece nuestro servicio. En el segundocaso, adems, proporcionaremos la informacin de binding y tipo de codificacin delservicio. La siguiente figura muestra la creacin de un fichero wsdl concreto con nombre"conversion", y con un enlazado "SOAP", con codificacin "Document/Literal".

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    21Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • Documento WSDL concreto con codificacin Document/Literal

    El siguiente paso es determinar la configuracin abstracta de nuestro WSDL. Tal ycomo se aprecia en la siguiente figura, se trata de indicar el nombre del portType, laoperacin que proporciona, as como el tipo de operacin (elegiremos una operacinsncrona, es decir, de tipo peticin-respuesta (Request-Response)), y los mensajes deentrada, salida y situaciones excepcionales (Fault).

    Configuracin abstracta del documento WSDL

    En un documento WSDL de tipo document/literal, utilizaremos un tipo XML predefinido,o bien de tipo para las diferentes "partes" de los mensajes deentrada/salida/excepciones. En este ltimo caso, tendremos que disponer de la definicindel tipo en el fichero de esquema (fichero xsd) que asociaremos al documento WSDL. Lasiguiente figura muestra que los tipos "eurosType" y "ptasType" se encuentran definidos

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    22Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • en el fichero "conversion.xsd"

    Seleccin del tipo de las partes de los mensajesFinalmente especificaremos la configuracin concreta del WSDL, indicando el nombrede binding, as como el nombre del servicio y del port asociado.

    Configuracin concreta del documento WSDL

    En la siguiente sesin veremos que, a partir de un wsdl, podemos generar un servcio web.

    10. Tipos de acceso para invocar servicios Web JAX-WS

    Tenemos dos formas diferentes de invocar un Servicio Web utilizando JAX-WS(llamaremos servicios web JAX-WS a aquellos servicios que utilizan la libreraJAX-WS): Creacin de un stub esttico: Consiste en generar una capa de stub por debajo del

    cliente de forma automtica. Dicho stub implementar la misma interfaz que elservicio, lo cul nos permitir desde nuestro cliente acceder al Servicio Web a travsdel stub tal y como si estuviramos accediendo directamente al servicio.Para utilizar este mecanismo es recomendable contar con alguna herramienta dentrode nuestra plataforma que nos permita generar dicho stub, para no tener queencargarnos nosotros de realizar esta tarea manualmente.

    Utilizacin de la Interfaz de Invocacin Dinmica (DII): Esta forma de acceso nospermitir hacer llamadas a procedimientos de nuestro Servicio Web de formadinmica, sin crear un stub para ello. Utilizaremos este tipo de invocacin cuando noconozcamos la interfaz del servicio a priori, en cuyo caso para invocar a dicho

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    23Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • servicio deberemos proporcionar nicamente los nombres de los mtodos a utilizarmediante una cadena de texto.Podremos utilizar esta interfaz dinmica aunque no contemos con un documentoWSDL que nos indique la interfaz y datos de nuestro servicio. En este caso,deberemos proporcionar manualmente esta informacin, para as poder acceder alservicio correctamente.

    Vamos a ver cmo invocar servicios web JAX-WS (crear un cliente web) utilizando unstub esttico con jdk 1.6, con Maven, y con Netbeans. Y despus comentaremos cmoutilizar la Interfaz de Invocacin Dinmica.

    Cuando utilizamos un stub esttico, los pasos generales para crear un cliente son:1. Codificar la clase cliente, implementando el acceso al servicio Web utilizando las

    interfaces de los stubs que se generarn con wsimport2. Generar los artefactos necesarios del servicio web para poder conectar con dicho

    servicio Web desde el cliente (mediante la utilidad wsimport)3. Compilar la clase cliente (empaquetar y desplegar si es necesario)4. Ejecutar el cliente11. Invocacin de servicios web JAX-WS con JDK 1.6

    A partir de JDK 1.6 se incluye en Java SE la librera JAX-WS y las herramientasnecesarias para crear e invocar servicios. Podemos encontrar las clases de la API deJAX-WS dentro del paquete javax.xml.ws y en subpaquetes de ste.

    Para crear un cliente en JDK 1.6 (o con JAX-WS en versiones anteriores de JDK)utilizaremos la herramienta wsimport, que tomar como entrada el documento WSDL delservicio al que queremos acceder y producir un conjunto de clases Java que nospermitirn acceder al servicio. Esta herramienta se puede invocar desde lnea decomando:

    wsimport -s -d -p

    El documento WSDL () se especificar mediante su ruta en el disco omediante su URL. Podemos proporcionar otros parmetros para indicar la forma en la quese debe generar el stub, como el directorio donde queremos que guarde los fuentes de lasclases generadas (), el directorio donde guardar estas clases compiladas(), y el paquete en el que se generar este conjunto de clases ().Por ejemplo podramos utilizar el siguiente comando para crear el cliente de un servicioHolaMundo que se encuentra definido enhttp://jtech.ua.es/HolaMundo/wsdl/HolaMundoSW.wsdl, separando los fuentes enel directorio src y las clases compiladas en bin, y generando todas estas clases dentro deun paquete es.ua.jtech.servcweb.hola.stub:

    wsimport -s src -d bin -p es.ua.jtech.servcweb.hola.stub

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    24Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • http://jtech.ua.es/HolaMundo/wsdl/HolaMundoSW.wsdl

    Con esto se generarn una serie de clases que nos permitirn acceder al servicio web einvocar sus operaciones desde nuestro cliente. Dentro de estas clases tendremos una querecibir el mismo nombre que el servicio, y que heredar de la clase Service. Deberemosinstanciar esta clase, y a partir de ella obtendremos el stub para acceder a un puerto delservicio. Este stub tendr la misma interfaz que el servicio web, y a partir de l podremosinvocar sus operaciones. En el ejemplo del servicio HolaMundo accederamos al serviciode la siguiente forma:

    HolaMundoSWService service = new HolaMundoSWService();HolaMundoSW port = service.getHolaMundoSW();

    System.out.println("Resultado: " + port.saluda("Miguel"));

    El servicio ofrece una operacin saluda que recibe un nombre, y genera un saludoincluyendo dicho nombre. En este ejemplo vemos como podemos invocar la operacinsaluda del servicio a partir del stub (port) como si se tratase de un mtodo de un objetolocal.

    12. Invocacin de servicios web JAX-WS desde una clase Java conMaven

    Ahora vamos a ver paso a paso cmo crear nuestro cliente de un servicio web JAX-WSutilizando Maven. Para ello necesitamos conocer la direccin del WSDL del servicio webal que vamos a acceder. Para este ejemplo, supongamos que dicha direccin es:http://localhost:8080/holaMundo/hola?WSDL

    El contenido del fichero wsdl es el siguiente:

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    25Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • Analizando la definicin ABSTRACTA del servicio Web en el wsdl anterior, podemosver que en la etiqueta (interfaz del servicio) se indica que el servicio ofrecela operacin con nombre hello, que tiene asociado un mensaje de entrada de tipo hello yun mensaje de salida de tipo helloResponse. Los tipos de los mensajes de entrada y salidaestn definidos en un fichero de esquema importado en , en el atributoschemaLocation, y cuyo valor podemos observar que eshttp://localhost:8080/HolaMundo/hola?xsd=1" (en muchas ocasiones, y porcomodidad, en lugar de importar el fichero de esquema, podemos incluir la definicin dedicho esquema en el propio fichero wsdl). Si accedemos a dicha direccin podemos verque el fichero de esquema contiene lo siguiente:

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    26Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • En el fichero de esquema (con extensin .xsd), podemos observar que los mensajes helloy helloResponse contienen cadenas de caracteres. Por lo tanto, nuestro servicio acepta unmensaje con una cadena de caracteres como entrada y como resultado tambin nosdevuelve otra cadena de caracteres.

    Analizando la definicin CONCRETA del servicio Web en el wsdl anterior, podemosver en la etiqueta se indica que la direccin para acceder al componente Port denuestro servicio Web es: http://localhost:8080/HolaMundo/hola. El nombre delcomponente es HolaPort, y se deber acceder al componente HolaPort a travs de unainstancia de la clase Hola.

    Ahora vamos a comenzar a desarrollar nuestro cliente para el servicio web anterior. Enprimer lugar crearemos un proyecto java con maven, por ejemplo utilizando el arquetipopor defecto maven-archetype-quickstart mediante:

    mvn archetype:generate -DgroupId=expertoJava-DartifactId=HolaMundoJavaClient-Dversion=1.0-SNAPSHOT-DarchetypeArtifactId=maven-archetype-quickstart-DinteractiveMode=false

    En el pom.xml generado tenemos que incluir, dentro de la etiqueta (y subetiqueta), los siguientes plugins jaxws-maven-plugin: para ejecutar la utilidad wsimport de JAX-WS y generar los

    stubs del servicio web. Vamos a configurar la ejecucin de la goal wsimport de formaque, a partir del wsdl situado en: http://localhost:8080/HolaMundo/hola?WSDL,genere los stubs necesarios, que por defecto se almacenan en el directoriotarget/jaxws/wsimport/java. Por defecto est asociado a la fasegenerate-sources del ciclo de vida de Maven. Wsimport se ejecutar, por tanto,antes de compilar los fuentes del proyecto.

    exec-maven-plugin: para ejecutar la aplicacin java desde mavenEl cdigo para el plugin jaxws-maven-plugin quedara como:

    org.jvnet.jax-ws-commonsjaxws-maven-plugin2.2

    wsimport

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    27Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • http://localhost:8080/HolaMundo/hola?WSDL

    true

    javax.xmlwebservices-api1.4

    El cdigo para el plugin exec-maven-plugin sera el siguiente:

    org.codehaus.mojoexec-maven-plugin1.2.1

    java

    expertoJava.App

    Adicionalmente necesitamos incluir en nuestro pom.xml la dependencia con la librerawebservices-rt

    com.sun.xml.wswebservices-rt1.4compile

    Tambin nos aseguraremos de incluir la codificacin del cdigo fuente como unapropiedad en nuestro fichero pom:

    UTF-8

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    28Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • A continuacin, compilaremos nuestro proyecto para generar los stubs necesarios conwsimport, y poder realizar llamadas al servicio web.

    mvn compile

    Podemos ver en pantalla que, al compilar, se ejecuta wsimport, se parsea el WSDL, y acontinuacin se genera el cdgio (stubs). Tambin se muestran los nombres de losficheros generados (ya que hemos incluido la etiqueta true en laconfiguracin de wsimport en nuestro pom).

    [INFO] Scanning for projects...[INFO][INFO]------------------------------------------------------------------------

    [INFO] Building HolaMundoJavaClient 1.0-SNAPSHOT[INFO]------------------------------------------------------------------------

    [INFO][INFO] --- jaxws-maven-plugin:1.10:wsimport (default) @HolaMundoJavaClient ---[INFO] Processing: http://localhost:8080/HolaMundo/hola?WSDL[INFO] jaxws:wsimport args: [-s, ..., -d, ..., -verbose, -catalog,

    (omitimos los detalles de la ejecucin de wsimport)parsing WSDL...

    generating code...

    sw/Hello.javasw/HelloResponse.javasw/Hola.javasw/Hola_Service.javasw/ObjectFactory.javasw/package-info.javacompiling code...

    javac -d ... (omitimos el comando de compilacin)[INFO][INFO] --- maven-resources-plugin:2.5:resources (default-resources) @HolaMundoJavaClient ---...

    [INFO] Using 'UTF-8' encoding to copy filtered resources.[INFO] skip non existing resourceDirectory/home/especialista/MavenProjects/

    HolaMundoJavaClient/src/main/resources[INFO][INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @HolaMundoJavaClient ---[INFO] Compiling 1 source files to/home/especialista/MavenProjects/HolaMundoJavaClient/target/classes[INFO]------------------------------------------------------------------------

    [INFO] BUILD SUCCESS[INFO]------------------------------------------------------------------------

    ...

    Podemos ver que wsimport genera en target/generated-sources/sw los siguientes

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    29Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • ficheros: Hola.java: contiene la Interfaz del servicio (SEI del servicio) Hola_Service.java: contiene la Clase heredada de Service, que utilizaremos para

    acceder al componente Port de nuestro servicio web a travs del SEI. Para ellodebemos utilizar el mtodo "Hola getHolaPort()" de la clase Hola_Service

    ObjectFactory.java: Contiene una factoria de mtodos para recuperarrepresentaciones java a partir de definiciones XML

    Hello.java, HelloResponse.java: son las clases que representan mensajes denuestro WSDL

    package-info.java: fichero con informacin sobre las clases generadas

    Ahora vamos a codificar la llamada al servicio web desde nuestra clase Java App:

    package jtech;public class App{

    public static void main( String[] args ){

    try {//Primero accedemos a un objeto Servicesw.Hola_Service service = new sw.Hola_Service();//a travs de l accedemos al Portsw.Hola port = service.getHolaPort();java.lang.String name = "amigos de los Servicios Web";//utilizamos el Port para llamar al WS a travs del SEIjava.lang.String result = port.hello(name);System.out.println("Result = "+result);

    } catch (Exception ex) {// TODO handle custom exceptions here}

    }}

    Podemos comprobar en el cdigo que nuestro cliente no es incapaz de distinguir si losmtodos a los que est llamando se estn ejecutando en local o en remoto, ni tampocopuede saber cmo est implementado el servicio (si es una clase java, un servlet, ejb, ...).De igual forma, en el cdigo anterior se aprecia que el cliente NO TIENE CONTROLsobre el ciclo de vida del servicio Web, de forma que no puede crear o destruirinstancias de un servicio Web (componentes Port). El cliente SLO ACCEDE a uncomponente Port. El ciclo de vida de los Ports o instancias de la implementacin de unServicio web, son generadas por el run-time en el que reside dicho servicio Web(tpicamente en un servidor de aplicaciones).Una vez creada nuestra clase cliente, vamos a empaquetar:

    mvn package

    ... y finalmente ejecutar nuestra aplicacin javamvn exec:java

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    30Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • El resultado debe ser:Hola amigos de los Servicios Web !

    Lgicamente, siempre y cuando el servicio est desplegado en un servidor de aplicacionesque est en marcha! :)

    13. Invocacin de servicios web JAX-WS desde una aplicacin Web conMaven

    Vamos a ver a cmo podemos invocar un servicio web JAX-WS desde un Servlet y/o JSPcon Maven. Utilizaremos el mismo wsdl del ejemplo del apartado anterior.En este caso comenzaremos por generar un proyecto Web java EE 6 con Maven:

    mvn archetype:generate -DgroupId=jtech-DartifactId=HolaMundoWebClient-Dversion=1.0-SNAPSHOT-DarchetypeArtifactId=webapp-javaee6-DarchetypeGroupId=org.codehaus.mojo.archetypes-DinteractiveMode=false

    ImportanteNo olvides incluir el parmetro -DarchetypeGroupId=org.codehaus.mojo.archetypes, si no lohaces as, Maven no encontrar el arquetipo webapp-javaee6 en el catlogo de arquetipos.

    Vamos a comentar brevemente el contenido del fichero pom.xml que hemos generado.Tenemos las siguientes dependencias y plugins. librera javaee-web-api (versin 6.0): necesaria para utilizar servlets con anotaciones plugin maven-compiler (version 2.3.2): necesitamos configurar la versin de los

    fuentes y ejecutables java (1.6), y para compilar las libreras del directorio"endorsed". Dicho directorio se contendr versiones actualizadas de libreras deanotaciones de servicios Web.

    plugin maven-war (version 2.1.1): utilizado para empquetar nuestro proyectoignorando el fichero web.xml a la hora de hacer el build de nuestro proyecto

    plugin maven-dependency (version 2.1): lo utilizaremos para copiar en el directorio"endorsed" (target/endorsed) la librera javaee-endorsed-api-6.0.jar. Esta librerapermite utilizar anotaciones de servicios Web y se utilizar en la libreracorrespondiente de jax-ws que viene incluida por defecto en jdk 6

    Para poder compilar y desplegar nuestro cliente de servicio Web en glassfish, vamos aaadir dos plugins ms: plugin jaxws-maven-plugin (version 2.2): con el que ejecutaremos la goal wsimport,

    igual que hicimos para el cliente Java del ejemplo anterior. plugin glassfish (version 2.1): para desplegar el war generado en el servidor de

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    31Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • aplicaciones, utilizando la goal glassfish:deploy. Para configurar el plugin, vamos aindicar la contrasea utilizando el fichero master-password, que contiene lacontrasea codificada del administrador del dominio, y que est situado en eldirectorio raz de dicho dominio (en nuestro caso glassfish/domains/domain1).Por defecto, la contrasea del administrador del dominio es changeit, y estacontrasea NO se guarda (es decir, no se crea el master-password). Para crear dichofichero tendremos que utilizar los siguientes comandos:/opt/glassfish-3.2.2/bin/asadmin stop-domain

    /opt/glassfish-3.2.2/bin/asadmin change-master-password--savemasterpassword=true domain1

    Este comando nos solicitar la contrasea actual y la nueva. Introducimos en amboscasos changeit. Como resultado se habr creado el ficheroglassfish/domains/domain1/master-password, que referenciaremos en nuestropom

    La configuracin del plugin de glassfish quedara como sigue:

    org.glassfish.maven.pluginmaven-glassfish-plugin2.1

    admin

    /opt/glassfish-3.2.2/glassfish/domains/domain1/master-password

    /opt/glassfish-3.2.2/glassfish

    domain148488080

    HolaMundoWebClient

    target/HolaMundoWebClient-1.0-SNAPSHOT.war

    Hemos configurado el despliegue de forma que el nombre del componente desplegado enGlassfish es HolaMundoWebClient. Dicho componente tendr asociado el war de nuestraaplicacin Web. Si despes de desplegar la aplicacin en Glassfish, ejecutamos elcomando asadmin list-applications, veremos que uno de las aplicaciones desplegadas esHolaMundoWebClient.

    ImportanteAntes de realizar el despliegue de nuestra aplicacin tenemos que asegurarnos de que en nuestrodirectorio HOME no tengamos el fichero .asadminpass. Si es as, procederemos arenombrarlo (por ejemplo lo podemos sustituir por .asadminpass-old).

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    32Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • Ahora vamos a implementar el servlet (por ejemplo lo podemos llamar NewServlet.java).Para ello utilizaremos la anotacin @WebServlet. Especificaremos los atributos name,con el nombre del servlet, y el atributo urlPatterns, en el que indicaremos la url con laque se accede a dicho servlet.

    Una posible implementacin puede ser la siguiente:

    package expertoJava;

    import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.xml.ws.WebServiceRef;import sw.Hola_Service;

    @WebServlet(name = "Hola", urlPatterns = {"/Hola"})public class NewServlet extends HttpServlet {

    @WebServiceRefprivate Hola_Service service;

    protected void processRequest(HttpServletRequest request,HttpServletResponse response)

    throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();try {

    out.println("");out.println("");out.println("Servlet HolaMundo");out.println("");out.println("");out.println("Servlet HolaMundo desde " +

    request.getContextPath() + "");

    try { // Obtenemos el Portsw.Hola port = service.getHolaPort();java.lang.String name = "amigos de los Servicios Web";// Llamamos a la operacin correspondiente del SEIjava.lang.String result = port.hello(name);out.println("Result = "+result);

    } catch (Exception ex) {// Manejo de excepciones

    }

    out.println("");out.println("");

    } finally {out.close();

    }}

    @Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse

    response)throws ServletException, IOException {

    processRequest(request, response);}

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    33Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • @Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse

    response)throws ServletException, IOException {

    processRequest(request, response);}

    @Overridepublic String getServletInfo() {

    return "Short description";}

    }

    Maven nos generar como raz del contexto por defecto de nuestro servlet el nombre delartefacto generado, es decir, HolaMundoWebClient-1.0-SNAPSHOT. Si quisiramosutilizar otro nombre, como por ejemplo HolaMundoWebClient, tendremos que aadir elfichero glassfish-web.xml (en el directorio src/main/webapp/WEB-INF/) con el siguientecontenido:

    HolaMundoWebClient

    Ahora ya estamos en disposicin de compilar, empaquetar, desplegar y ejecutar nuestrocliente. Los stubs necesarios para realizar la llamada al servicio Web se generarn durantela compilacin. A continuacin empaquetaremos la aplicacin, lo cual generar el wartarget/HolaMundoWebClient-1.0-SNAPSHOT.war.

    mvn compile

    mvn package

    Antes de desplegar la aplicacin nos aseguraremos de que el servidor de aplicaciones esten marcha. Podemos arrancarlo desde lnea de comandos con:

    /opt/glassfish-3.1.2.2/bin/asadmin start-domain

    Utilizando el comando asadmin list-domains, podemos ver qu dominios se estnejecutando. A continuacin desplegamos nuestra aplicacin.El siguiente paso es desplegar dicho war en el servidor de aplicaciones Glassfish.Recordemos que el componente desplegado se llamar: HolaMundoWebClient.

    mvn glassfish:deploy

    Para comprobar que nuestra aplicacin web se ha desplegado, podemos usar el comandoasadmin list-applications.

    Con el plugin de glassfish podemos tambin eliminar el componente desplegado de

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    34Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • glassfish:mvn glassfish:undeploy

    O redesplegar dicho componente (sera equivalente a hacer un undeploy, seguido de undeploy):

    mvn glassfish:redeploy

    Finalmente, podemos ver la ejecucin de nuestro servlet, accediendo a la siguientedireccin, y suponiendo que hemos configurado la raiz del contexto comoHolaMundoWebClient en el fichero glassfish-web.xml:

    http://localhost:8080/HolaMundoWebClient/Hola

    Podramos querer pasar el parmetro de entrada directamente en la llamada desde elnavegador, para lo que tendremos que incluir en nuestro cdigo del servlet las siguienteslneas:

    String cadena = request.getParameter("x");...

    out.println("" + port.hello(cadena) + "%lt;/p>");

    Ahora podemos pasar los parmetros de entrada al servlet de la siguiente forma:http://localhost:8080/HolaMundoWebClient/Hola?x=pepe%20de%20Alicante

    Los %20 son espacios en blanco. x es el nombre del parmetro de entrada.

    Si en vez de un parmetro, nuestra aplicacin requiere ms de uno, se deben pasar lasparejas "variable=valor" separadas por el carcter &.Ficheros de despliegue: web.xml

    El uso de servlets con anotaciones hace que NO sea necesario proporcionar el fichero conla configuracin del despliegue (fichero web.xml). A continuacin mostramos el cdigode dicha configuracin (web.xml), que puede incluirse en el directoriosrc/main/webapp/WEB-INF:

    HolaexpertoJava.NewServlet

    Hola/Hola

    30

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    35Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • Uso de la anotacin @WebServiceRefJava EE 6 permite "inyectar" una referencia a un servicio Web remoto, a travs del uso dela anotacin @WebServiceRef. Utilizando esta anotacin, el contenedor inyectar unainstancia del WS (un objeto Service) en tiempo de ejecucin. Ya hemos visto que, apartir del WSDL, es posible escribir un proxy (stub) java para invocar a un servicio Web(WS). La herramienta wsimport genera, a partir del WSDL, las clases e interfaces javaque hacen posible la ejecucin de una llamada a un WS por un cliente. Las interfacesgeneradas representan el SEI (Service Endpoint Interface), a travs del cual podemosrealizar llamadas locales al WS remoto va HTTP.

    El cliente puede obtener una instancia del proxy del WS utilizando la anotacin@WebServiceRef de la siguiente forma:

    ...

    @WebServiceRefprivate MiServicio myService;...

    MiPuerto myPort=myService.getMiPuertoPort();...

    MyServicio es una clase que hereda de javax.xml.ws.Service, y es generada por laherramienta wsimport.

    Si nuestro cliente NO reside en un contenedor (NO es gestionado por el contenedor),entonces NO soporta el uso de dicha anotacin. Es decir, podemos hacer uso de@WebServiceRef cuando nuestro cliente sea, por ejemplo, un servlet o un EJB, pero nocuando sea una clase java plana. En este ltimo caso tendremos que crear la instancianosotros mismos (tendremos que hacer un new) del servicio directamente en nuestrocdigo):

    private MiServicio myService = new MiServicio();...

    MiPuerto myPort=myService.getMiPuertoPort();...

    La anotacin @WebServiceRef puede soportar, entre otros, los siguientes parmetros: name: identifica la referencia al servicio Web. El valor de name es un nombre local a

    la aplicacin que utiliza dicho recurso (WS). El nombre pude ser un nombre JNDIabsoluto o relativo al espacio de nombres JNDI de java: java:comp/env. El valor pordefecto es la cadena vaca

    wsdlLocation: identifica la URL del documento WSDL del servicio webreferenciado. Por defecto contiene la cadena vaca. Si dicho valor est presente,"sobreescribe" (overrides) la localizacin del documento WSDL que se haya

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    36Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • especificado en la anotacin WebService de la clase del servicio referenciado que hasido generada en el cliente (en nuestro caso la clase Hola_Service generada porwsimport)

    type: identifica el tipo del recurso como un objeto de una clase Java. Por defecto suvalor es Object.class

    value: identifica el tipo del recurso como un objeto de una clase Java. Por defecto suvalor es Service.class

    Invocacin del servicio Web desde una pgina JSPPara ilustrar un ejemplo de una invocacin al servicio Web desde una pgina jsp,simplemente tendremos que incluir la llamada a dicho WS desdesrc/main/webapp/index.jsp, por ejemplo, as:

    JSP Page

    Hola Mundo!

    Una vez compilado y re-desplegado nuestro cliente Web, para comprobar que se ejecutala invocacin al servicio Web desde la pgina jsp, accederemos a la direccin:

    http://localhost:8080/HolaMundoWebClient/

    14. Invocacin de servicios web con Netbeans

    Vamos a ver ahora cmo crear un cliente de servicios web de forma visual medianteNetbeans. Este entorno utilizar internamente las libreras y herramientas estndar de Sunpara crear stub del cliente.

    En primer lugar, deberemos crear un proyecto, o utilizar uno ya existente. Este proyecto

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    37Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • podr ser de cualquier tipo (aplicacin Java, aplicacin Web, etc). Para nuestro ejemplocrearemos un proyecto Maven Java.

    Creacin de un cliente desde Netbeans

    El proyecto se llamar HelloClient y tendr una clase principal App en el paquetejtech.helloclient.

    Datos de la creacin del proyecto

    Por defecto, la versin del cdigo fuente es la 1.5. Podramos cambiar a otra versin msactual (por ejemplo la 1.6) pulsando con botn derecho Properties->Sources y editandoel campo Source/Binary format.Una vez tengamos el proyecto java creado, podremos aadir el stub para acceder a unservicio web pulsando con el botn derecho sobre el proyecto y seleccionando la opcinNew->Web Service Client ....

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    38Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • Creacin de un cliente de servicio Web

    Se abrir un asistente para crear el stub del cliente. Aqu deberemos especificar en primerlugar el documento WSDL que define el servicio al que vamos a acceder, por ejemploindicando la URL en la que se encuentra. En segundo lugar especificaremos el paquete enel que queremos que se generen las clases del stub.

    Datos para la creacin del stub en el cliente

    Finalmente, una vez introducidos estos datos pulsaremos el botn Finish, tras lo cual seinvocar a wsimport para generar el stub del servicio. Una vez generado el stub delcliente, podremos ver en la carpeta Generated Sources (jaxws-wsimport) del proyecto lasclases generadas. En la carpeta Web Service References veremos la referencia al puerto yoperaciones que proporciona el servicio Web referenciado.

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    39Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • Ficheros generados por wsimport y referencias al WS

    Una vez creado el stub del cliente, deberemos utilizarlo en nuestra aplicacin paraacceder al servicio. Vamos a suponer que lo queremos invocar desde la clase principal denuestra aplicacin (App), aunque lo mismo podra hacerse para invocarlo desde cualquierotra clase, o incluso desde un JSP. Para crear el cdigo que llame al servicio pulsaremoscon el botn derecho del ratn en el lugar del fuente de nuestra clase en el que queramosinsertar la llamada (en nuestro ejemplo, en el fichero App.java dentro del mtodo main),y con el botn derecho seleccionaremos la opcin Insert Code..., y a continuacin CallWeb Service Operation.

    NotaDe forma alternativa podramos aadir el cdigo que invoca el servicio arrastrando el laoperacin hola de la carpeta Web Service References, hasta el lugar del cdigo donde queremosrealizar la llamaada.

    Se abrir una ventana en la que deberemos seleccionar la operacin que queramosinvocar. En nuestro caso seleccionaremos la operacin hello del servicio hola ypulsamos el botn OK

    Seleccin de la operacion del WS a invocar en el cliente

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    40Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • Una vez hecho esto, Netbeans generar en nuestra clase el cdigo que hace la llamada alservicio. Deberemos editar este cdigo para especificar los parmetros que vamos aproporcionar en la llamada.

    Edicin de la llamada al servicio web

    Con esto ya podremos ejecutar nuestra aplicacin cliente (con el botn derecho sobrenuestro proyecto, pulsando Run ), que se conectar al servicio web hola. El resultado semostrar en el panel de salida de Netbeans.

    Ejecucin del cliente java del servicio Web hola

    15. Gestor de servicios web de Netbeans

    En Netbeans tambin encontramos un gestor de servicios web, en el que tenemosdisponibles algunos servicios web externos proporcionados por terceros (Google,StrikeIron), y al que podemos aadir otros servicios, propios o ajenos. De esta formapodemos tener un catlogo de servicios que podremos incorporar de forma rpida anuestras aplicaciones, e incluso probarlos desde el propio entorno.

    Podemos acceder a este gestor de servicios a travs de la seccin Web Services de laventana Services de Netbeans. Aqu veremos una lista de servicios que ya vienenincluidos en Netbeans y que podremos probar o incorporar en nuestras aplicaciones.Vamos a aadir un nuevo servicio. Para ello antes creamos un grupo en el que incluirlo.Pulsamos con el botn derecho sobre Web Services y seleccionamos Create Group paracrear el nuevo grupo.

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    41Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • Gestor de servicios web de Netbeans

    Vamos a aadir un servicio HelloService. Vamos a crear un grupo de nombre jTech en elque incluiremos los servicios proporcionados por dicha entidad.

    Creacin de un nuevo grupo de servicios

    Pulsamos sobre el grupo con el botn derecho y seleccionamos Add Web Service ... paraaadir el nuevo servicio.

    Aadimos un nuevo servicio en el grupo creado

    Como datos del servicio proporcionamos la direccin del documento WSDL que lodefine. Adems podemos tambin especificar el paquete en el cual generar la librera conel stub necesario para acceder al servicio. Cuando terminemos de introducir los datospulsamos Add para aadir el nuevo servicio.

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    42Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • Datos del servicio web para el gestor de servicios

    Una vez tenemos el servicio aadido, podemos desplegarlo para ver las operaciones queofrece y probarlas pulsando sobre ellas con el botn derecho y seleccionando Test Method

    Prueba de un servicio desde el gestor de servicios

    Nos aparecer una ventana en la que deberemos introducir los parmetros necesarios parainvocar el servicio, y tras ello pulsar sobre el botn Submit para invocarlo y ver elresultado obtenido.

    Datos para la prueba del servicio y resultado obtenido

    Tambin podemos utilizar los servicios del gestor en nuestras aplicaciones de formasencilla. Simplemente tendremos que arrastrar la operacin que queramos invocar sobreel lugar del cdigo fuente en el que queramos hacer la llamada. Al hacer esto se aadir anuestro proyecto una librera (JAR) con el stub necesario para acceder al servicio.

    16. Interfaz de invocacin dinmica (DII)

    Mediante esta interfaz ya no utilizaremos un stub para invocar los mtodos del servicio,sino que nos permitir invocar los mtodos de forma dinmica, indicando simplemente elnombre del mtodo que queremos invocar como una cadena de texto, y sus parmetros

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    43Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • como un array de objetos.Esto nos permitir utilizar servicios que no conocemos previamente. De esta formapodremos implementar por ejemplo un broker de servicios. Un broker es un serviciointermediario, al que podemos solicitar alguna tarea que necesitemos. Entonces el brokerintentar localizar el servicio ms apropiado para dicha tarea en un registro de servicios, ylo invocar por nosotros. Una vez haya conseguido la informacin que requerimos, nos ladevolver. De esta forma la localizacin de servicios se hace totalmente transparente paranosotros.

    Podremos acceder con esta interfaz tanto si contamos con un documento WSDL como sino contamos con l, pero en el caso de que no tengamos el WSDL deberemos especificaren el cdigo todos los datos incluidos en estos documentos que necesitemos y de los queen este caso no disponemos (endpoint, parmetros y tipos, etc).

    16.1. A partir de un documento WSDL

    Vamos a ver el caso en el que contamos con el documento WSDL que describe elservicio. El primer paso ser conseguir el objeto Service igual que hicimos en el casoanterior. La clase javax.xml.ws.Service es una abstraccin que representa un servicioWSDL (etiqueta service).La clase Service acta como una factora que proporciona tanto proxies para el enpoint deun servicio (de forma esttica utilizando los stubs generados), como instancias parallamadas a operaciones remotas de forma dinmica.

    Un ejemplo de uso dinmico de Service es el siguiente:

    ServiceFactory sf = ServiceFactory.newInstance();Service serv = sf.createService(

    new URL("http://localhost:8080/HolaMundo/hola?WSDL"),new QName("http://localhost:8080/HolaMundo", "hello"));

    Utilizaremos el objeto Call para hacer las llamadas dinmicas a los mtodos del servicio.Deberemos crear un objeto Call correspondiente a un determinado puerto y operacin denuestro servicio:

    Call call = serv.createCall(new QName("http://localhost:8080/HolaMundo", "holaPort"),new QName("http://localhost:8080/HolaMundo", "hello"));

    El ltimo paso ser invocar la llamada que hemos creado:

    String result = (String) call.invoke(new Object[] { "Miguel" });

    A este mtodo le debemos proporcionar un array de objetos como parmetro, ya que debepoder utilizarse para cualquier operacin, con diferente nmero y tipo de parmetros.

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    44Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • Como tampoco se conoce a priori el valor devuelto por la llamada, deberemos hacer unaconversin cast al tipo que corresponda, ya que nos devuelve un Object genrico.

    16.2. Sin un documento WSDL

    Si no contamos con el WSDL del servicio, crearemos un objeto Service proporcionandonicamente el nombre del servicio:

    ServiceFactory sf = ServiceFactory.newInstance();Service serv = sf.createService(new QName("http://jtech.ua.es", "hola"));

    A partir de este objeto podremos obtener un objeto Call para realizar una llamada alservicio de la misma forma que vimos en el caso anterior:

    Call call = serv.createCall(new QName("http://localhost:8080/HolaMundo", "holaPort"),new QName("http://localhost:8080/HolaMundo", "hello"));

    En este caso el objeto Call no tendr ninguna informacin sobre las caractersticas delservicio, ya que no tiene acceso al documento WSDL que lo describe, por lo quedeberemos proporcionrselas nosotros explcitamente.

    En primer lugar, deberemos especificar el endpoint del servicio, para que sepa a qudireccin debe conectarse para acceder a dicho servicio:

    call.setTargetEndpointAddress(endpoint);

    Una vez especificada esta informacin, deberemos indicar el tipo de datos que nosdevuelve la llamada a la operacin que vamos a invocar (en nuestro ejemplo saluda):

    QName t_string =new QName("http://www.w3.org/2001/XMLSchema", "string");call.setReturnType(t_string);

    Por ltimo, indicaremos los parmetros de entrada que toma la operacin y sus tipos:

    QName t_string =new QName("http://www.w3.org/2001/XMLSchema", "string");call.addParameter("string_1", t_string, ParameterMode.IN);

    Una vez hecho esto, podremos invocar dicha operacin igual que en el caso anterior:

    String result = (String) call.invoke(new Object[] { "Miguel" });

    Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    45Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

  • Introduccin a los Servicios Web. Invocacin de servicios web SOAP.

    46Copyright 2012-2013 Dept. Ciencia de la Computacin e IA All rights reserved.

    1 Qu es un Servicio Web?2 Caractersticas de los Servicios Web3 Tipos de servicios Web4 Arquitectura de los Servicios Web5 Servicios Web SOAP y Java EE6 Tecnologas bsicas para Servicios Web6.1 SOAP6.2 WSDL6.3 UDDI

    7 Interoperabilidad de los WS: Metro y JAX-WS8 Los servicios Web desde la vista del Cliente9 Ficheros WSDL y de esquema con Netbeans10 Tipos de acceso para invocar servicios Web JAX-WS11 Invocacin de servicios web JAX-WS con JDK 1.612 Invocacin de servicios web JAX-WS desde una clase Java con Maven13 Invocacin de servicios web JAX-WS desde una aplicacin Web con Maven14 Invocacin de servicios web con Netbeans15 Gestor de servicios web de Netbeans16 Interfaz de invocacin dinmica (DII)16.1 A partir de un documento WSDL16.2 Sin un documento WSDL