Title: Tema 5 - Servicios Web con Axis
1Tema 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
2Introducció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
3Introducció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
4SOA
- 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
5Servicios 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
6SOAP
- 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.
7Petició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
8Respuesta 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
9Apache 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-
10Apache 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.
11Caracterí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
12Proceso de Generación de Programas con Axis
13Instalació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)
14Instalació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
15Creando 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
16Có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
17Compilando 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 ...
18Ejecució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
19Có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
20Consumiendo 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
-
21Consumiendo 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
22Consumiendo 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())
-
23Consumiendo un Servicio Web
- Los objetos Service y Call son los objetos
estándar JAX-RPC que permiten guardar metadatos
sobre el servicio a invocar.
24Consumiendo 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
25Consumiendo 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)
26Publicando 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
27Publicando 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
28Calculator.java
- public class Calculator
- public int add(int i1, int i2)
-
- return i1 i2
-
- public int subtract(int i1, int i2)
-
- return i1 - i2
-
29CalcClient.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")
30CalcClient.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)
-
-
31Custom 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)
32Web 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
33Web 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
34Utilizando 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.
35Manejadores 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
36Manejadores 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
37Pasos 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!"
38MyService.java
- package ej3customdeployment
- public class MyService
-
- public String serviceMethod(String arg)
-
- return arg
-
39Client.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
40deploy.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
41Mapeos 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
42Pasando 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
43Pasando 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
44Web 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
45Usando 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
46WSDL2Java 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
47WSDL2Java
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)
48Mapeo 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() ...
49Mapeo 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
-
50Mapeo 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
51Mapeo 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
52Servicios
- 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
53Uso 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)
-
54Bindings 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
55Bindings 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
56Los Skeleton
- Intermediario entre el Axis engine y la
implementación del servicio - Su nombre es el del binding con el sufijo Skeleton
57Compilació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
58Herramienta 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)
59Herramienta 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
60Java2WSDL
- 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
61Servicios Web de Consumo Público
- Acceder a la url http//www.xmethods.net
- Generar la parte cliente del servicio web con el
comando WSDL2Java
62Tareas 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
63Cliente 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
64Calculadora.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)
-
-
65Cliente 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
66Cliente 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)
-