Soap y WDSL
Soap y WDSL
Soap y WDSL
Estas tecnologías han demostrado ser muy efectivas para el establecimiento de sitios
Web, sin embargo presentan una serie de desventajas, como son total incompatibilidad e
interoperabilidad entre ellas, total dependencia de la máquina servidora sobre la que
corren, así como el lenguaje de programación.
Concepto de SOAP
• El SOAP envelope que define el marco de trabajo que determina qué se puede
introducir en un mensaje, quién debería hacerlo y si esa operación es opcional u
obligatoria.
1
Objetivos de SOAP
Por otra parte, los servidores Web pueden procesar las peticiones de usuario empleando
tecnologías tales como Servlets, páginas ASP (Active Server Pages), páginas JSP (Java
Server Pages) o sencillamente un servidor de aplicaciones con invocación de objetos
mediante CORBA, COM o EJB.
Supongamos que tenemos un servicio Web el cual contiene una relación de productos
junto con una serie de características de éstos, y supongamos que le queremos hacer una
consulta acerca del precio de uno de los productos cuyo código es RHAT, el código
relativo a la petición de consulta en lenguaje SOAP sería:
<?xml version="1.0"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<getQuote xmlns="http://namespaces.cafeconleche.org/xmljava/ch2/">
<symbol>RHAT</symbol>
</getQuote>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
<?xml version="1.0"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<Quote xmlns="http://namespaces.cafeconleche.org/xmljava/ch2/">
<Price>4.12</Price>
</Quote>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Partes de un mensaje SOAP
Un mensaje SOAP no es más que un documento en formato XML que está constituido
por tres partes bien definidas que son: el SOAP envelope, el SOAP header de carácter
opcional y el SOAP body. Cada uno de estos elementos contiene lo siguiente:
Un ejemplo de uso del header, donde se indica un cierto parámetro útil para el servicio
Web que le indica como debe procesar el mensaje sería:
<?xml version="1.0"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
SOAP- ENV:encodingStyle= "http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Header>
<t:Transaction xmlns:t="some-URI" SOAP-ENV:mustUnderstand="1">
5
</t:Transaction>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<getQuote xmlns= "http://namespaces.cafeconleche.org/xmljava/ch2/">
<symbol>RHAT</symbol>
</getQuote>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Un ejemplo de uso del nuevo elemento body sería el siguiente, en el que se ha detectado
un error en la aplicación que corre sobre el servidor que provoca que no opere
convenientemente, por lo que se le indica al cliente:
<?xml version="1.0"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
SOAP-ENV:encodingStyle= "http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Server</faultcode>
<faultstring>Server Error</faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
• http://schemas.xmlsoap.org/soap/encoding/ y
• http://my.host/encoding/restricted http://my.host/encoding/.
Todo mensaje SOAP debe tener un elemento Envelope asociado a la dirección de red
http://schemas.xmlsoap.org/soap/envelope/. Si un mensaje recibido por una aplicación
SOAP contiene en este elemento un valor distinto al anterior la aplicación trataría dicho
mensaje como erróneo.
Serialización
A la hora de introducir los datos en un mensaje SOAP existen una serie de normas a
tener en cuenta. De esta forma SOAP define una serie de tipos básicos que serán
empaquetados de forma directa y una serie de mecanismos para empaquetar tipos
complejos y estructurados formados por elementos simples.
En un inicio, SOAP consideró un conjunto de tipos como tipos simples con el fin de
realizar un mapeo directo entre el propio documento SOAP y tipos básicos de Java.
Ahora bien, actualmente este conjunto ha aumentado notablemente de forma que existe
un número bastante grande de tipos que gozan de esta situación. De entre todos ellos
destacan los indicados en la Figura [7].
Además de todos estos tipos sencillos, SOAP implementa una serie de mecanismos para
serializar tipos complejos con elementos simples en su interior. De esta forma tenemos:
• Structs
<Quote xmlns="http://namespaces.cafeconleche.org/xmljava/ch2/">
<Symbol>RHAT</Symbol>
<Price>4.12</Price>
</Quote>
En términos de Java tendríamos un objeto de tipo Quote dentro del cual hay dos
elementos sencillos: uno de tipo String llamado Symbol y el otro de tipo double y de
nombre Price. Es decir:
Aunque en Java sea obligatorio que dentro de un array haya únicamente elementos
del mismo tipo, SOAP no presenta esta restricción, sino que es posible albergar
elementos de distintos tipos, así un ejemplo sería:
<Bid xsi:type="SOAP-ENC:Array">
<Symbol xsi:type="xsd:token">RHAT</Symbol>
<Price xsi:type="xsd:double">4.12</Price>
<Account xsi:type="xsd:string">777-7777</Account>
</Bid>
<SOAP-ENC:Array SOAP-ENC:arrayType="xsd:double[3,2]">
<SOAP-ENC:double>1.1</SOAP-ENC:double>
<SOAP-ENC:double>1.2</SOAP-ENC:double>
<SOAP-ENC:double>2.1</SOAP-ENC:double>
<SOAP-ENC:double>2.2</SOAP-ENC:double>
<SOAP-ENC:double>3.1</SOAP-ENC:double>
<SOAP-ENC:double>3.2</SOAP-ENC:double>
</SOAP-ENC:Array>
double[][] array = {
{1.1, 1.2},
{2.1, 2.2},
{3.1, 3.2}
}
O un ejemplo algo más complicado sería un Array que contiene a su vez dos arrays
cada uno de los cuales contiene a su vez un Array de Strings:
<SOAP-ENC:Array SOAP-ENC:arrayType="xsd:string[][2]">
<item href="#array-1"/>
<item href="#array-2"/>
</SOAP-ENC:Array>
Una de las funcionalidades con las que cuenta SOAP y que lo hace extremadamente
atractivo es el envío de mensajes SOAP vía protocolo HTTP, todo ello realizado de
forma directa por medio de las librerías de SOAP.
Este hecho provoca que existen ciertas diferencias entre un mensaje SOAP normal y
uno enviado haciendo uso del protocolo HTTP. De esta forma deben cumplirse dos
aspectos:
• El HTTP header del mensaje de petición al servicio Web debe contener un campo
SOAPAction. El campo SOAPAction alerta a los servidores Web y firewalls por los
que pase de que el mensaje contiene documento SOAP, esto facilita a dichos
firewalls el filtrado de las peticiones SOAP sin necesidad de tener que explorar el
contenido del body del mensaje.
<?xml version="1.0"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" >
<SOAP-ENV:Body>
<getQuote xmlns="http://namespaces.cafeconleche.org/xmljava/ch2/">
<symbol>RHAT</symbol>
</getQuote>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
HTTP/1.0 200 OK
Content-Type: text/xml; charset="utf-8"
Content-Length: 260
<?xml version="1.0"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<Quote xmlns="http://namespaces.cafeconleche.org/xmljava/ch2/">
<Price>4.12</Price>
</Quote>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
WSDL
En este apartado se verá el lenguaje de descripción de Servicios Web WSDL 1.1 [5],
cuya especificación completa [WSDL 1.1] puede encontrarse en el W3C.
Una descripción formal de los patrones de mensaje resulta aún más importante en el
caso de Servicio Web más complejos. Algunos servicios podrían aceptar una petición
pero no enviar la respuesta correspondiente devuelta al cliente. Otros podrían solamente
enviar mensajes al cliente. Además, el esquema no contiene información sobre cómo
acceder al Servicio Web. Como SOAP es independiente del protocolo, se
intercambiarán los mensajes entre el cliente y el servidor de numerosas formas. ¿Cómo
se sabe si hay que enviar un mensaje mediante HTTP, SMTP o cualquier otro protocolo
de transporte? Más aún, ¿cómo se sabe la dirección la que hay que enviar el mensaje?
Los documentos WSDL definen los servicios como colecciones de puntos finales de red
o puertos. En WSDL, la definición abstracta de puntos finales y de mensajes se separa
de la instalación concreta de red o de los enlaces del formato de datos. Esto permite la
reutilización de definiciones abstractas: mensajes, que son descripciones abstractas de
los datos que se están intercambiando y tipos de puertos, que son colecciones abstractas
de operaciones. Las especificaciones concretas del protocolo y del formato de datos para
un tipo de puerto determinado constituyen un enlace reutilizable. Un puerto se define
por la asociación de una dirección de red y un enlace reutilizable; una colección de
puertos define un servicio. Por esta razón, un documento WSDL utiliza los siguientes
elementos en la definición de servicios de red:
• Types: contenedor de definiciones del tipo de datos que utiliza algún sistema de
tipos (por ejemplo XSD).
• Message: definición abstracta y escrita de los datos que se están comunicando.
• Operation: descripción abstracta de una acción admitida por el servicio.
• Port Type: conjunto abstracto de operaciones admitidas por uno o más puntos
finales.
• Binding: especificación del protocolo y del formato de datos para un tipo de
puerto determinado.
• Port: punto final único que se define como la combinación de un enlace y una
dirección de red.
• Service: colección de puntos finales relacionados.
A continuación se detalla un poco más en profundidad cada uno de estos elementos
Elemento_Types:
Elemento message:
Elemento PortType:
Elemento Binding:
Elemento Service:
Elemento Extensibilidad :
Conclusiones