Tema 5 - Servicios Web con Axis - PowerPoint PPT Presentation

About This Presentation
Title:

Tema 5 - Servicios Web con Axis

Description:

Tema 5 - Servicios Web con Axis Dr. Diego Lz. de Ipi a Gz. de Artaza http://paginaspersonales.deusto.es/dipina http://paginaspersonales.deusto.es/dipina/cursos ... – PowerPoint PPT presentation

Number of Views:104
Avg rating:3.0/5.0
Slides: 67
Provided by: basq8
Category:

less

Transcript and Presenter's Notes

Title: Tema 5 - Servicios Web con Axis


1
Tema 5 - Servicios Web con Axis
  • Dr. Diego Lz. de Ipiña Gz. de Artaza
  • http//paginaspersonales.deusto.es/dipina
  • http//paginaspersonales.deusto.es/dipina/cursos/J
    2EECesine.zip
  • dipina_at_eside.deusto.es

2
Introducción I
  • Los Servicios Web son la piedra angular de
    cualquier desarrollo de sistemas distribuidos
    actual
  • Los ordenadores hablan unos a otros a través de
    la web usando HTTP y otros protocolos.
  • Un servicio web no tiene interfaz gráfica
  • Provee una API de métodos que pueden ser
    invocados en la web
  • Diseñados para proveer servicios

3
Introducción II
  • Futuro en el que los negocios exponen
    aplicaciones a clientes como Servicios Web en los
    cuales se paga por su uso
  • Los sistemas de diferentes empresas cooperan unos
    con otros a través de la Web
  • Mientras que DCOM está basado en estándares
    propietarios, los Servicios Web lo están en XML y
    HTTP
  • Son independientes de la plataforma y del
    lenguaje como CORBA, pero más aceptados
  • En .NET, IIS y la infraestructura ASP.NET
    compilan las fuentes, construyen contratos WSDL y
    manejan las peticiones y respuestas de los
    servicios web.
  • En Java AXIS realiza una tarea muy similar

4
SOA
  • Los servicios web han dado lugar a un nuevo modo
    de diseñar sistemas distribuídos
  • Arquitecturas SOA (Service Oriented Arquitecture)
  • SOA colección de servicios
  • Más información en http//www.service-architecture
    .com/
  • http//msdn.microsoft.com/Longhorn/understanding/p
    illars/Indigo/default.aspx?pull/library/en-us/dnb
    da/html/srorientwp.asp

5
Servicios Web
  • Son un estándar basado en protocolos abiertos
    como HTTP y SOAP
  • SOAP es un vocabulario XML que representa RPCs
  • http//www.w3.org/TR/SOAP
  • No necesitas ni Windows ni .NET, ni UNIX ni Java
    para escribir servicios web
  • Servicio web aplicación que
  • se ejecuta en un servidor web
  • expone métodos a clientes
  • escucha peticiones HTTP representando comandos
    que invocan a métodos Web
  • ejecuta métodos web y devuelve resultados

6
SOAP
  • SOAP es un protocolo de comunicación basado en
    XML útil para la comunicación entre aplicaciones
  • Actualmente en versión 1.2, aunque la más
    utilizada es la 1.1
  • http//www.w3.org/2000/xp/Group/
  • SOAP es reconocido como el backbone de una nueva
    generación de aplicaciones multi-platforma y
    multi-lenguaje, denominado Servicios Web.
  • SOAP es un mecanismo para el intercambio de
    mensajes a través de Internet independiente de
    los lenguajes de programación
  • Es un protocolo de transporte
  • Los clientes envían una petición SOAP mediante un
    HTTP POST normalmente y reciben un código de
    respuesta (éxito o error) y una respuesta SOAP
  • Un mensaje SOAP es un mensaje XML que consta de
    un conjunto de cabeceras opcionales y de un
    cuerpo.

7
Petición SOAP
  • ltsoapEnvelope xmlnssoap"http//schemas.xmlsoap.
    org/soap/envelope/"gt
  • ltsoapBodygt
  • ltgetProductDetails xmlns"http//warehouse.ex
    ample.com/ws"gt
  • ltproductIdgt827635lt/productIdgt
  • lt/getProductDetailsgt
  • lt/soapBodygt
  • lt/soapEnvelopegt

8
Respuesta SOAP
  • ltsoapEnvelope xmlnssoap"http//schemas.xmlsoap.
    org/soap/envelope/"gt
  • ltsoapBodygt
  • ltgetProductDetailsResponse
    xmlns"http//warehouse.example.com/ws"gt
  • ltgetProductDetailsResultgt
  • ltproductNamegtToptimate 3-Piece
    Setlt/productNamegt
  • ltproductIdgt827635lt/productIdgt
  • ltdescriptiongt3-Piece luggage set. Black
    Polyester.lt/descriptiongt
  • ltpricegt96.50lt/pricegt
  • ltinStockgttruelt/inStockgt
  • lt/getProductDetailsResultgt
  • lt/getProductDetailsResponsegt
  • lt/soapBodygt
  • lt/soapEnvelopegt

9
Apache AXIS
  • AXIS es un motor SOAP, una framework para
    construir tanto la parte servidora como cliente
    de Servicios Web.
  • Además
  • Incluye un servidor
  • Un servlet que se integra con motores de servlets
    como Tomcat
  • Soporte extensivo del estándar Web Service
    Description Language (WSDL)
  • Una herramienta para generar clases Java a partir
    de WSDL
  • Un conjunto de aplicaciones de ejemplo
  • Una herramienta para la monitorización de los
    paquetes TCP/IP
  • Open source, disponible en
  • http//ws.apache.org/axis/
  • WS-

10
Apache Axis
  • Axis es disponible en el fichero axis.jar que
    implementa la API JAX-RPC API declarada en los
    ficheros JAR jaxrpc.jar y saaj.jar. Requiere
    varias bibliotecas de ayuda, para logeo,
    procesamiento WSDL e introspección.

11
Características AXIS
  • La arquitectura de AXIS está basada en cadenas
    configurables de manejadores de mensajes que
    implementan pequeños fragmentos de funcionalidad
    de una manera flexible
  • Sus propiedades principales
  • Rápido implementado con un procesador XML SAX
  • Flexible
  • Estable
  • Orientado a Compontes
  • Soporta WSDL 1.1
  • Apache EXtensible Interaction System (AXIS) ?
    motor SOAP muy configurable

12
Proceso de Generación de Programas con Axis
13
Instalación Axis
  • Bajarse la distribución de Apache Axis de
    http//ws.apache.org/axis/
  • La versión actual es 1.2RC2
  • Bajarse tanto versión binaria (ya compilado) como
    fuente (contiene ejemplos)
  • Instalar un contenedor de servlets como Tomcat 5
  • Copiar el directorio axis-1_2RC2\webapps\axis
    contenido en la distribución de Axis en
    TOMCAT_HOME\webapps
  • Instalar .jar terceros necesitados por Axis,
    copiándolos en TOMCAT_HOME\common\lib
  • Junit.jar (Junit Testing System -
    http//www.junit.org/index.htm)
  • mail.jar (Java Mail - http//java.sun.com/products
    /javamail/)
  • activation.jar (Java Beans Activation Framework -
    http//java.sun.com/products/javabeans/glasgow/jaf
    .html)

14
Instalación Axis
  • Arrancar el servidor web
  • Validar la instalación http//127.0.0.18080/axis
    / (hacer clic en Validate)
  • Validar un SOAP endpoint http//localhost8080/a
    xis/services/Version?methodgetVersion
  • Axis soporta HTTP GET

15
Creando Servicios Web .jws
  • Axis tiene un método muy sencillo de crear
    servicios web básicos, mediante el mecanismo de
    ficheros .jws
  • Cuando alguien solicita a través de una url un
    fichero .jws, éste es compilado y ejecutado
  • Revisar ejemplo http//localhost8080/axis/EchoHe
    aders.jws?methodlist

16
Cómo Instalar un Nuevo Servicio Web
  • Dos pasos
  • Copiar el código del servicio web bajo el
    directorio TOMCAT_HOME\webapps\axis WAR
  • En el directorio WEB-INF\classes de AXIS copiar
    las clases de tu nuevo servicio web
  • Si tus clases están en un .jar simplemente
    copiarlas a WEB-INF\lib
  • Informar al motor de AXIS acerca del nuevo
    fichero
  • Se realiza haciendo un POST de un fichero de
    explotación (wsdd) mediante el programa
    AdminClient
  • El Web Service Deployment Descriptor describe en
    XML cuál es el servicio web y qué métodos exporta

17
Compilando Servicios Web
  • Para compilar servicios web necesitamos colocar
    en nuestro CLASSPATH las dependencias de AXIS
  • set AXIS_HOMEc\axis
  • set AXIS_LIBAXIS_HOME\lib
  • set AXISCLASSPATHAXIS_LIB\axis.jarAXIS_LIB\c
    ommons-discovery.jarAXIS_LIB\commons-logging.ja
    rAXIS_LIB\jaxrpc.jarAXIS_LIB\saaj.jarAXIS_
    LIB\log4j-1.2.8.jarAXIS_LIB\xml-apis.jarAXIS
    _LIB\xercesImpl.jar
  • Luego podemos hacer
  • javac classpath AXISCLASSPATH
  • java -cp AXISCLASSPATH ...

18
Ejecución del AdminClient
  • Buscar en axis\samples\stock un ejemplo de un
    fichero de explotación web de AXIS deploy.wsdd.
  • Registrar el servicio web mediante el comando
  • java -cp AXISCLASSPATH org.apache.axis.client.Ad
    minClient -lhttp//localhost8080/axis/services/Ad
    minService deploy.wsdd
  • Para probar el servicio web acceder a
  • java -cp .AXISCLASSPATH samples.stock.GetQuote
    -lhttp//localhost8080/axis/servlet/AxisServlet
    -uuser1 -wpass1 XXX

19
Cómo Añadir AXIS a tu Aplicación Web
  • Los pasos a seguir son
  • Añadir axis.jar, wsdl.jar, saaj.jar, jaxrpc.jar y
    otras bibliotecas dependientes a tu fichero WAR
  • Copiar todas las declaraciones del servlet de
    Axis y sus mapeos de axis/WEB-INF/web.xml y
    añadirlos a tu propio web.xml
  • Construir y desplegar la aplicación web
  • Ejecutar el AdminClient de AXIS contra tu propia
    aplicación web, en vez de contra AXIS, cambiando
    la url con la que invocas a AXIS

20
Consumiendo un Servicio Web
  • Vamos a desarrollar una pequeña aplicación
    cliente que consume el servicio web más sencillo
    que podemos imaginar, implementado en Echo.jws,
    que copiaremos a TOMCAT_HOME\webapps\AXIS\
  • public class Echo
  • public String echoString(String msg)
  • return msg

21
Consumiendo un Servicio Web
  • A continuación, vamos a definir un cliente que me
    permita consumir este servicio web desde línea de
    comando
  • Desde un navegador podríamos invocar a este
    servicio mediante la URL
  • http//localhost8080/axis/Echo.jws?methodechoStr
    ingmsghola

22
Consumiendo un Servicio Web
  • import org.apache.axis.client.Call
  • import org.apache.axis.client.Service
  • import javax.xml.namespace.QName
  • public class EchoClient
  • public static void main(String args)
  • try
  • String endpoint "http//localhost808
    0/axis/Echo.jws"
  • Service service new Service()
  • Call call (Call)
    service.createCall()
  • call.setTargetEndpointAddress( new
    java.net.URL(endpoint) )
  • call.setOperationName(new
    QName("http//soapinterop.org/", "echoString") )
  • String ret (String) call.invoke( new
    Object "Hello!" )
  • System.out.println("Sent 'Hello!', got
    '" ret "'")
  • catch (Exception e)
  • System.err.println(e.toString())

23
Consumiendo un Servicio Web
  • Los objetos Service y Call son los objetos
    estándar JAX-RPC que permiten guardar metadatos
    sobre el servicio a invocar.

24
Consumiendo un Servicio Web
  • Al invocar el método la siguiente información
    aparecería en el navegador
  • lt?xml version"1.0" encoding"UTF-8"?gt
  • ltSOAP-ENVEnvelope xmlnsxsd"http//www.w3.org/20
    01/XMLSchema"
  • xmlnsSOAP-ENV"http//schemas.
    xmlsoap.org/soap/envelope/"
  • xmlnsxsi"http//www.w3.org/20
    01/XMLSchema-instance"gt
  • ltSOAP-ENVBodygt
  • ltns1echoString xmlnsns1"http//soapinterop.
    org/"gt
  • ltarg0 xsitype"xsdstring"gtHello!lt/arg0gt
  • lt/ns1echoStringgt
  • lt/SOAP-ENVBodygt
  • lt/SOAP-ENVEnvelopegt

25
Consumiendo un Servicio Web
  • Si deseamos dar nombre a los parámetros solamente
    deberemos insertar el siguiente código
  • // Call to addParameter/setReturnType as
    described in user-guide.html
  • call.addParameter("testParam", org.apache.axis.Con
    stants.XSD_STRING, javax.xml.rpc.ParameterMode.IN)
  • Si queremos indicar a AXIS cuál es el tipo de
    dato devuelto haríamos
  • call.setReturnType(org.apache.axis.Constants.XSD_S
    TRING)

26
Publicando un Servicio Web con AXIS
  • Vamos a suponer que tenemos una clase Calculator
    que queremos sea accesible como Servicio Web.
  • Tenemos dos mecanismos
  • A través de un fichero .JWS
  • Registrando el nuevo servicio vía AxisAdmin
    usando desplegamiento propietario

27
Publicando con JWS
  • Sólo para Servicios Web muy sencillos
  • Con esta instrucción se desplegaría
  • copy Calculator.java ltyour-webapp-rootgt/axis/Calcu
    lator.jws
  • Para invocarlo haríamos http//localhost8080/axi
    s/Calculator.jws
  • O nos crearíamos nuestros clientes propietarios.
  • Revisar samples/userguide/example2/Calculator.java

28
Calculator.java
  • public class Calculator
  • public int add(int i1, int i2)
  • return i1 i2
  • public int subtract(int i1, int i2)
  • return i1 - i2

29
CalcClient.java
  • import org.apache.axis.client.Call
  • import org.apache.axis.client.Service
  • import org.apache.axis.encoding.XMLType
  • import org.apache.axis.utils.Options
  • import javax.xml.rpc.ParameterMode
  • public class CalcClient
  • public static void main(String args) throws
    Exception
  • Options options new Options(args)
  • String endpoint "http//localhost"
    options.getPort()
  • "/axis/Calculator.jws"
  • args options.getRemainingArgs()
  • if (args null args.length ! 3)
  • System.err.println("Usage CalcClient
    ltaddsubtractgt arg1 arg2")

30
CalcClient.java
  • Integer i1 new Integer(args1)
  • Integer i2 new Integer(args2)
  • Service service new Service()
  • Call call (Call)
    service.createCall()
  • call.setTargetEndpointAddress( new
    java.net.URL(endpoint) )
  • call.setOperationName( method )
  • call.addParameter( "op1", XMLType.XSD_INT,
    ParameterMode.IN )
  • call.addParameter( "op2", XMLType.XSD_INT,
    ParameterMode.IN )
  • call.setReturnType( XMLType.XSD_INT )
  • Integer ret (Integer) call.invoke( new
    Object i1, i2 )
  • System.out.println("Got result " ret)

31
Custom Deployment
  • Habrá ocasiones en que queramos exportar código
    anteriormente realizado como un servicio web
  • Además a menudo se requerirán configuraciones más
    sofisticadas inclusión de Handlers
  • Para acceder a toda la flexibilidad configurativa
    de AXIS necesitamos utilizar Web Service
    Deployment Descriptor (WSDD)

32
Web Service Deployment Descriptor
  • Describe un conjunto de configuraciones que
    quieres hacer disponible a AXIS
  • Por ejemplo
  • ltdeployment xmlns"http//xml.apache.org/axis/wsdd
    /"
  • xmlnsjava"http//xml.apache.org/axis
    /wsdd/providers/java"gt
  • ltservice name"MyService" provider"javaRPC"gt
  • ltparameter name"className" value"samples.userg
    uide.example3.MyService"/gt
  • ltparameter name"allowedMethods" value""/gt
  • lt/servicegt
  • lt/deploymentgt
  • Indicamos que el servico web MyService de tipo
    javaRPC es definido en la clase
    samples.userguide.example3.MyService y hacemos
    disponibles todos los métodos públicos en esa
    clase

33
Web Service Deployment Descriptor
  • Algunas opciones adicionales que se pueden
    especificar en un .wsdd son
  • Alcance de los servicios, se pueden definir
    servicios web con tres alcances
  • request ? crea un nuevo objeto cada vez que se
    recibe una petición al servicio
  • application ? un solo objeto servirá todas las
    peticiones
  • session ? un objeto por cada sesión de cliente
  • Por ejemplo
  • ltservice name"MyService"...gt
  • ltparameter name"scope" valuerequest"/gt
  • ...
  • lt/servicegt

34
Utilizando el AdminClient
  • La clase org.apache.axis.client.AdminClient
    permite el envío del fichero de explotación al
    servidor Tomcat, si está escuchando en un puerto
    diferente al 8080 hay que enviar el parámetro p
    ltportgt.
  • java org.apache.axis.client.AdminClient
    deploy.wsdd
  • java org.apache.axis.client.AdminClient list
  • java org.apache.axis.client.AdminClient
    undeploy.wsdd
  • Revisar samples/userguide/example3.

35
Manejadores y Cadenas
  • Los Handlers (o manejadores) permiten pre/post
    procesar peticiones a servicios web.
  • Por ejemplo, para contar el número de
    invocaciones recibidas
  • Revisar ejemplo samples/log
  • En el .wsdd podemos colocar un elemento handler
    que puede recibir una serie de parámetros
    (subelemento parameter)
  • Después, podemos definir services que usan los
    handler, mediante subelementos requestFlow del
    service
  • Estos handlers son invocados antes de que el
    provider sea invocado

36
Manejadores y Cadenas
  • ltdeployment xmlns"http//xml.apache.org/axis/wsdd
    /"
  • xmlnsjava"http//xml.apache.org/axis
    /wsdd/providers/java"gt
  • lt!-- define the logging handler configuration
    --gt
  • lthandler name"track" type"javasamples.userguid
    e.example4.LogHandler"gt
  • ltparameter name"filename" value"MyService.log"
    /gt
  • lt/handlergt
  • lt!-- define the service, using the log handler
    we just defined --gt
  • ltservice name"LogTestService"
    provider"javaRPC"gt
  • ltrequestFlowgt
  • lthandler type"track"/gt
  • lt/requestFlowgt
  • ltparameter name"className" value"samples.userg
    uide.example4.Service"/gt
  • ltparameter name"allowedMethods" value""/gt
  • lt/servicegt
  • lt/deploymentgt

37
Pasos para Crear un Servicio Web con Custom
Deployment
  • Crear un directorio de trabajo
    examples/webservices/ej3customdeployment
  • Crear la clase Java que define el servicio web
    (MyService.java)
  • Crear el cliente web (Client.java)
  • Crear el descriptor de despliegue para este
    servicio (deploy.wsdd)
  • Crear el descriptor para eliminar este servicio
    (undeploy.wsdd)
  • cd ej3customdeployment
  • Compilar el código javac .java
  • Ejecutar el AdminClient java org.apache.axis.clie
    nt.AdminClient deploy.wsdd
  • copy ej3customdeployment/.class
    TOMCAT_HOME\axis\WEB-INF\classes\
    ej3customdeployment
  • Ejecutar cd .. java ej3customdeployment.Client
    -lhttp//localhost8080/axis/services/MyService
    "test me!"

38
MyService.java
  • package ej3customdeployment
  • public class MyService
  • public String serviceMethod(String arg)
  • return arg

39
Client.java
  • package ej3customdeployment
  • import org.apache.axis.client.Call
  • import org.apache.axis.client.Service
  • import org.apache.axis.encoding.XMLType
  • import org.apache.axis.utils.Options
  • import javax.xml.namespace.QName
  • import javax.xml.rpc.ParameterMode
  • public class Client
  • public static void main(String args)
  • try
  • Options options new Options(args)
  • String endpointURL
    options.getURL()
  • String textToSend
  • args options.getRemainingArgs()
  • if ((args null) (args.length lt
    1))
  • textToSend "ltnothinggt"
  • else

40
deploy.wsdd/undeploy.wsdd
  • deploy.wsdd
  • ltdeployment xmlns"http//xml.apache.org/axis/wsdd
    /"
  • xmlnsjava"http//xml.apache.org/axis
    /wsdd/providers/java"gt
  • ltservice name"MyService" provider"javaRPC"gt
  • ltparameter name"className" value"ej3customdepl
    oyment.MyService"/gt
  • ltparameter name"allowedMethods" value""/gt
  • lt/servicegt
  • lt/deploymentgt
  • undeploy.wsdd
  • ltundeployment xmlns"http//xml.apache.org/axis/ws
    dd/"gt
  • ltservice name"MyService"/gt
  • lt/undeploymentgt

41
Mapeos de WSDL a Java
xsdbase64Binary byte
xsdboolean boolean
xsdbyte byte
xsddateTime java.util.Calendar
xsddecimal java.math.BigDecimal
xsddouble double
xsdfloat float
xsdhexBinary byte
xsdint int
xsdinteger java.math.BigInteger
xsdlong long
xsdQName javax.xml.namespace.QName
xsdshort short
xsdstring java.lang.String
42
Pasando Objetos en Servicios Web
  • Las excepciones se representan como elementos
    wsdlfault
  • Podemos pasar objetos como argumentos con la
    ayuda del elemento del elemento beanmapping en un
    .wsdd
  • ltbeanMapping qname"nslocal" xmlnsns"someNamesp
    ace" languageSpecificType"javamy.java.thingy"/gt
  • Revisar ejemplo samples/userguide/example5/BeanSe
    rvice.java
  • ltdeployment xmlns"http//xml.apache.org/axis/wsdd
    /" xmlnsjava"http//xml.apache.org/axis/wsdd/pro
    viders/java"gt
  • ltservice name"OrderProcessor"
    provider"javaRPC"gt
  • ltparameter name"className"
    value"samples.userguide.example5.BeanService"/gt
  • ltparameter name"allowedMethods"
    value"processOrder"/gt
  • ltbeanMapping qname"myNSOrder"
    xmlnsmyNS"urnBeanService" languageSpecificType
    "javasamples.userguide.example5.Order"/gt
  • lt/servicegt
  • lt/deploymentgt

43
Pasando Objetos en Servicios Web
  • Dado que el BeanSerializer no permite transformar
    clases ya existentes que no conformen con el
    estándar JavaBean, es posible utilizar custom
    serialization
  • Para ello en el wsdd colocaremos
  • lttypeMapping qname"nslocal" xmlnsns"someNamesp
    ace" languageSpecificType"javamy.jav
    a.thingy"
  • serializer"my.java.Serializer"
    deserializer"my.java.DeserializerFactory"
    encodingStyle"http//schemas.xmlsoap.org/soa
    p/encoding/"/gt

44
Web Services Description Language (WSDL)
  • Si miramos al fichero WSDL encontraremos
  • Elemento service que describe el servicio web
  • Elementos operation que documentan las
    operaciones
  • Elementos binding que documentan los protocolos
    soportados por el servicio web
  • Etc.
  • Para publicar un servicio web deberemos publicar
    su contrato, WSDL.
  • Otros desarrolladores pueden utilizar el contrato
    para desarrollar clientes web
  • Nomalmente procesan el fichero WSDL a través de
    una herramienta que genera clases wrapper

45
Usando WSDL con Axis
  • Web Service Description Language (WSDL) permite
    describir los servicios web de una manera
    estructurada
  • Un WSDL nos da la siguiente información
  • La interfaz al servicio
  • Los parámetros que acepta
  • La localización del servicio
  • AXIS soporta WSDL de tres formas
  • Podemos obtener el wsdl de un servicio accediendo
    a su URL en un navegador y colocando el sufijo
    ?wsdl
  • http//localhost8080/axis/Echo.jws?wsdl
  • Herramienta WSDL2Java que genera Java proxies y
    skeletons a partir de descriptores WSDL
  • Herramienta Java2WSDL que construye WSDL a partir
    de clases Java

46
WSDL2Java proxies, stubs y tipos de datos
  • Esta herramienta es disponible en la clase
    org.apache.axis.wsdl.WSDL2Java
  • Su uso sería
  • java org.apache.axis.wsdl.WSDL2Java
    (WSDL-file-URL)
  • Existe la tarea wsdl2java en Ant

47
WSDL2Java
WSDL clause Java class(es) generated
For each entry in the type section A java class
A holder if this type is used as an inout/out parameter
For each portType A java interface
For each binding A stub class
For each service A service interface
A service implementation (the locator)
48
Mapeo Tipos
  • ltxsdcomplexType name"phone"gt
  • ltxsdallgt
  • ltxsdelement name"areaCode" type"xsdint"/gt
  • ltxsdelement name"exchange"
    type"xsdstring"/gt
  • ltxsdelement name"number" type"xsdstring"/gt
  • lt/xsdallgt
  • lt/xsdcomplexTypegt
  • Mapearía a
  • public class Phone implements java.io.Serializable
  • public Phone() ...
  • public int getAreaCode() ...
  • public void setAreaCode(int areaCode) ...
  • public java.lang.String getExchange() ...
  • public void setExchange(java.lang.String
    exchange) ...
  • public java.lang.String getNumber() ...
  • public void setNumber(java.lang.String
    number) ...
  • public boolean equals(Object obj) ...
  • public int hashCode() ...

49
Mapeo Parámetros de Entrada/Salida
  • package samples.addr.holders
  • public final class PhoneHolder implements
    javax.xml.rpc.holders.Holder
  • public samples.addr.Phone value
  • public PhoneHolder()
  • public PhoneHolder(samples.addr.Phone value)
  • this.value value

50
Mapeo PortTypes
  • ltmessage name"empty"gt
  • ltmessage name"AddEntryRequest"gt
  • ltpart name"name" type"xsdstring"/gt
  • ltpart name"address" type"typensaddress"/gt
  • lt/messagegt
  • ltportType name"AddressBook"gt
  • ltoperation name"addEntry"gt
  • ltinput message"tnsAddEntryRequest"/gt
  • ltoutput message"tnsempty"/gt
  • lt/operationgt
  • lt/portTypegt
  • Mapearía a
  • public interface AddressBook extends
    java.rmi.Remote
  • public void addEntry(String name, Address
    address) throws java.rmi.RemoteException

51
Mapeo Bindings
  • Su nombre es el nombre del Binding con el sufijo
    Stub
  • Implementa el SDI (Service Description Interface)
  • Actúa como un proxy entre el cliente y el
    servicio web
  • El stub esconde el endpoint, namespace, o los
    arrays de parámetros
  • Así el siguiente fragmento de wsdl generaría
  • ltbinding name"AddressBookSOAPBinding"
    type"tnsAddressBook"gt ... lt/bindinggt
  • Lo siguiente
  • public class AddressBookSOAPBindingStub extends
    org.apache.axis.client.Stub

  • implements AddressBook
  • public AddressBookSOAPBindingStub() throws
    org.apache.axis.AxisFault
  • ...
  • public AddressBookSOAPBindingStub(URL
    endpointURL,

  • javax.xml.rpc.Service service)
  • throws org.apache.axis.AxisFault
  • ...
  • public AddressBookSOAPBindingStub(javax.xml.rp
    c.Service service)
  • throws org.apache.axis.AxisFault

52
Servicios
  • Normalmente un cliente instanciará un localizador
    de servicios y luego llamará al método get para
    recuperar su stub.
  • Se deriva del elemento service de WSDL
  • ltservice name"AddressBookService"gt
  • ltport name"AddressBook" binding"tnsAddressBoo
    kSOAPBinding"gt
  • ltsoapaddress location"http//localhost8080/
    axis/services/AddressBook"/gt
  • lt/portgt
  • lt/servicegt
  • Como
  • public interface AddressBookService extends
    javax.xml.rpc.Service
  • public String getAddressBookAddress()
  • public AddressBook getAddressBook() throws
    javax.xml.rpc.ServiceException
  • public AddressBook getAddressBook(URL
    portAddress) throws javax.xml.rpc.ServiceException
  • WSDL2Java will also generate the locator which
    implements this interface
  • public class AddressBookServiceLocator extends
    org.apache.axis.client.Service

53
Uso del Service Locator
  • public class Tester
  • public static void main(String args)
    throws Exception
  • // Make a service
  • AddressBookService service new
    AddressBookServiceLocator()
  • // Now use the service to get a stub
    which implements the SDI.
  • AddressBook port service.getAddressBook(
    )
  • // Make the actual call
  • Address address new Address(...)
  • port.addEntry("Russell Butek", address)

54
Bindings en la Parte Servidora Skeleton
  • Stub es el proxy en el cliente de un Servicio Web
  • El Skeleton es el proxy del Servicio Web en el
    servidor
  • Necesitas especificar los flags --server-side
    --skeletonDeploy true" cuando invocas WSDL2java
  • java org.apache.axis.wsdl.WSDL2Java --server-side
    --skeletonDeploy true AddressBook.wsdl

55
Bindings en la Parte Servidora Skeleton
WSDL clause Java class(es) generated
For each binding A skeleton class
An implementation template class
For all services One deploy.wsdd file
One undeploy.wsdd file
56
Los Skeleton
  • Intermediario entre el Axis engine y la
    implementación del servicio
  • Su nombre es el del binding con el sufijo Skeleton

57
Compilación Ejemplo ej4-wsdl2java
  • Los pasos a seguir serían
  • java org.apache.axis.wsdl.WSDL2Java --server-side
    AddressBook.wsdl
  • cd AddressFetcher2
  • javac .java
  • java org.apache.axis.client.AdminClient
    deploy.wsdd

58
Herramienta Java2WSDL
  • Crear una interfaz Java o una clase que describa
    la interfaz del servicio web. Por ejemplo
  • package ej5java2wsdl
  • public interface MyWidgetPrice
  • public void setWidgetPrice(String widgetName,
    String price)
  • public String getWidgetPrice(String
    widgetName)

59
Herramienta Java2WSDL
  • Crear el WSDL por medio de Java2WSDL
  • Para crear el WSDL asociado a la clase anterior
    haríamos
  • java org.apache.axis.wsdl.Java2WSDL -o wp.wsdl
    -l"http//localhost8080/axis/services/MyWidgetPri
    ce" -n "urnExample6" -p"ej5java2wsdl"
    "urnExample6" ej5java2wsdl.MyWidgetPrice
  • donde
  • -o indica el nombre del fichero WSDL de salida
  • -l denota la localización del servicio
  • -n es el espacio de nombres de destino del
    fichero WSDL
  • -p indica un mapeo del paquete al espacio de
    nombres.
  • la clase que contiene la interfaz del servicio
    web.
  • Para más información sobre Java2WSDL revisar
    http//ws.apache.org/axis/java/reference.html

60
Java2WSDL
  • Utilizar WSDL2Java para generar los bindings
  • El comando
  • java org.apache.axis.wsdl.WSDL2Java -o . -d
    Session -s -S true -NurnExample6 ej5java2wsdl
    wp.wsdl
  • Generaría
  • WidgetPriceSoapBindingImpl.java fichero Java
    conteniendo la implementación por defecto de la
    parte servidora del servicio web Web Service
  • Habrá que modificar esta clase para añadir tu
    implementación
  • WidgetPrice.java nueva interfaz que contiene los
    java.rmi.Remote apropiados
  • WidgetPriceService.java fichero que contiene la
    interfaz de la parte cliente
  • WidgetPriceServiceLocator.java fichero
    conteniendo la implementación de la parte cliente
    del servicio
  • WidgetPriceSoapBindingSkeleton.java el skeleton
    de la parte servidora
  • WidgetPriceSoapBindingStub.java el stub de la
    parte cliente
  • deploy.wsdd descriptor de explotación
  • undeploy.wsdd descriptor de desesplotación
  • Tipos de datos ficheros correspondientes a los
    tipos y holders del servicio web

61
Servicios Web de Consumo Público
  • Acceder a la url http//www.xmethods.net
  • Generar la parte cliente del servicio web con el
    comando WSDL2Java

62
Tareas Ant para Construir Ejemplos
  • Las siguientes tareas en Ant simplifican la
    compilación y despliegue de servicios web
  • ltaxis-wsdl2javagt
  • ltaxis-java2wsdlgt
  • ltaxis-admingt
  • Para más información mirar en http//ws.apache.or
    g/toshi/jp-site/axis/java/ant/ant.html
  • Revisar ejemplo samples\userguide\example6\build.x
    ml

63
Cliente Calculadora en .NET
  • Vamos a realizar un cliente para nuestro Servicio
    Web calculadora en .NET
  • wsdl http//localhost8080/axis/Calculator.jws?wsd
    l
  • Escribimos fichero Calculadora.cs
  • csc CalculatorService.cs Calculadora.cs
  • Ejecutamos Calculadora.exe

64
Calculadora.cs
  • using System
  • class Calculadora
  • public static void Main ()
  • CalculatorService calc new CalculatorService
    ()
  • int sum calc.add (2, 2)
  • Console.WriteLine ("2 2 " sum)
  • int resta calc.subtract (2, 2)
  • Console.WriteLine ("2 - 2 " resta)

65
Cliente Calculadora en Java
  • Pasos de desarrollo
  • java org.apache.axis.wsdl.WSDL2Java
    http//localhost8080/axis/Calculator.jws?wsdl
  • Escribir clase CalcClient
  • Compilarla javac CalcClient
  • Ejecutarla java CalcClient

66
Cliente Calculadora en Java
  • import localhost.axis.Calculator_jws.
  • public class CalcClient
  • public static void main(String args)
    throws Exception
  • // Make a service
  • CalculatorService service new
    CalculatorServiceLocator()
  • // Now use the service to get a stub
    which implements the SDI.
  • Calculator port service.getCalculator()
  • // Make the actual call
  • int sum port.add(2,2)
  • System.out.printf("22d\n", sum)
  • int resta port.subtract(2,2)
  • System.out.printf("2-2d\n", resta)
Write a Comment
User Comments (0)
About PowerShow.com