WSDL Bindings


(Imagen: Rembrandt- Saskia, como Flora)

En la sección bindings del WSDL, el atributo style puede tomar los valores de rpc y document, donde document es el valor por defecto. El atributo use puede tomar los valores de literal y encoded, donde literal es el valor por defecto. Entonces, las combinaciones posibles de style y use serían:



De todas las combinaciones listadas, las más frecuentes de Web Services basados en SOAP son document/literal y rpc/literal. El valor encoded del atributo use es válido en un documento WSDL, pero no se ajusta a las directivas de WS-I (Web Services- Interoperability).

Servicios document-style

El estilo document indica que los mensajes de nuestro Web Service basado en SOAP contienen documentos XML completos. Por otro lado, el estilo rpc indica que los mensajes SOAP contienen parametros en los mensajes request y valores de retorno en mensajes response. Veamos un WSDL con estilo rpc:

<types></types>
<message name="getTimeAsString"></message>
<message name="getTimeAsStringResponse">
<part name="time_response" type="xsd:string"></part>
</message>
<message name="getTimeAsElapsed"></message>
<message name="getTimeAsElapsedResponse">
<part name="time_response" type="xsd:long"></part>
</message>


La sección types está vacía porque el servicio utiliza, como valores retornados, sólamente los tipos simples xsd:string y xsd:long. Los tipos simples no requieren una definición en la sección types del WSDL. También, los atributos name de los mensajes muestran la relación con los métodos Java (@WebMethods) correspondientes (getTimeAsString y getTimeAsElapsed). Los mensajes response tienen un sub-elemento part, que contiene el tipo de dato del valor devuelto. Como los mensajes request no requieren argumentos (en este caso), los mensajes request no necesitan sub-elementos part.

Ahora, el WSDL de TimeServer, pero usando como estilo document:

<types>
<xsd:schema>
<xsd:import schemaLocation="http://localhost:9876/ts?xsd=1"
namespace="http://ts.ch02/">
</xsd:import>
</xsd:schema>
</types>
<message name="getTimeAsString">
<part element="tns:getTimeAsString" name="parameters"></part>
</message>
<message name="getTimeAsStringResponse">
<part element="tns:getTimeAsStringResponse" name="parameters"></part>
</message>
<message name="getTimeAsElapsed">
<part element="tns:getTimeAsElapsed" name="parameters"></part>
</message>
<message name="getTimeAsElapsedResponse">
<part element="tns:getTimeAsElapsedResponse" name="parameters"></part>
</message>


Ahora types contiene una directiva import para el documento XSD asociado. Dicho documento es:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:tns="http://ts.ch02/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://ts.ch02/" version="1.0">
<xs:element name="getTimeAsElapsed"
type="tns:getTimeAsElapsed">
</xs:element>
<xs:element name="getTimeAsElapsedResponse"
type="tns:getTimeAsElapsedResponse">
</xs:element>
<xs:element name="getTimeAsString"
type="tns:getTimeAsString">
</xs:element>
<xs:element name="getTimeAsStringResponse"
type="tns:getTimeAsStringResponse">
</xs:element>
<xs:complexType name="getTimeAsString"></xs:complexType>
<xs:complexType name="getTimeAsStringResponse">
<xs:sequence>
<xs:element name="return"
type="xs:string" minOccurs="0">
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="getTimeAsElapsed"></xs:complexType>
<xs:complexType name="getTimeAsElapsedResponse">
<xs:sequence>
<xs:element name="return" type="xs:long"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>


El documento XSD define cuatro tipos complejos cuyos nombres son los nombres de los mensajes correspondientes en la seccción messages. En el estilo rpc, los mensajes llevan los nombresde los @WebMethods; mientras que con el estilo document los mensajes llevan los nombres de los tipos XSD definidos en la sección types del WSDL.

El estilo document soporta servicios con tipos de datos definidos explícitamente, dado que el WSDL del servicio puede hacerlo mediante un documento XSD. Desde una perspectiva de arquitectura, el estilo document es más simple dado que el cuerpo del mensaje SOAP es un documento autocontenido y preciso. El estilo rpc requiere mensajes con los nombres de las operaciones asociadas y con parámetros como sub-elementos.

Ahora, el atributo use determina como los tipos de datos del servicio van a ser codificados y decodificados. En el servicio, el documento WSDL tiene que especificar como los tipos de datos usados en el lenguaje de implementación (Java) son serializados a tipos soportados por WSDL (tipos de esquemas XML). Por el lado del cliente, los tipos soportados por WSDL deben ser deserializados en tipos del lenguaje del cliente (Ruby). La configuración use='literal'implica que los tipos del servicio siguen el esquema XML del documento WSDL "literalmente". Por otro lado, la configuración use='encoded' significa que los definiciones de tipos del servicio provienen de reglas de codificación, por lo general reglas de codificación de la especificación SOAP 1.1.

Basado en el capítulo 2 de Java Web Services: Up and Running de Martin Kalin

Publicar un comentario