Estilos de documento: wrapped y unwrapped


(Imagen: Rembrandt - El cegamiento de Sansón)

El estilo document es valor defecto según WS-Basic Profile. Este estilo nos permite, a través de XSD en la sección types del WSDL, definir los tipos de datos para los mensajes SOAP.

Al usar la convención wrapped, se le da a los servicios con estilo document el look and feel de un servicio de estilo rpc. Primero, veamos un mensaje SOAP unwrapped:

<?xml version="1.0" ?>
<!-- Unwrapped document style -->
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soapenv:Body>
<num1 xmlns:ans="http://ts.ch01/">27</num1>
<num2 xmlns:ans="http://ts.ch01/">94</num1>
</soapenv:Body>
</soapenv:Envelope>


Y ahora, un mensaje wrapped:

<?xml version="1.0" ?>
<!-- Wrapped document style -->
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soapenv:Body>
<addNums xmlns:ans="http://ts.ch01/">
<num1>27</num1>
<num2>94</num1>
</addNums>
</soapenv:Body>
</soapenv:Envelope>


El body del SOAP envelope de request unwrapped tiene dos elementos: num1 y num2. Estos números deben sumarse. El cuerpo del SOAP no contiene el nombre de la operación del servicio que va a realizar la suma y enviar el resultado como respuesta. Por otro lado, el body del SOAP Envelope de request wrapped tiene un sólo elemento: addNums (que se corresponde con la operación a invocar) y dos subelementos, cada uno conteniendo el número a sumar. La versión wrapped hace la operación de servicio explícita. Los argumentos de la operación estñan anidados, como sub-elementos dentro del elemento de la operación addNums.

Para implementar la convención wrapped, para el estilo document, hacer lo siguiente:

El cuerpo del SOAP Envelope debe tener sólamente una parte, o sea, un sólo elemento XML con la cantidad de sub-elementos requerida

La relación entre el XSD del WSDL y el elemento XML del cuerpo SOAP está definida

Los elementos del XSD nos sirven como wrappers del cuerpo del mensaje SOAP. Así:

<?xml version="1.0" ?>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.or g/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soapenv:Body>
<ans:getTimeAsElapsedResponse xmlns:ans="http://ts.ch01/">
<return>1205030105192</return>
</ans:getTimeAsElapsedResponse>
</soapenv:Body>
</soapenv:Envelope>


El wrapper del request tiene el mismo nombre que la operación del servicio, cuyos mensajes tienen asignado un tipo. Así, la sección portType sería:

<portType name="TimeServer">
<operation name="getTimeAsString">
<input message="tns:getTimeAsString"></input>
<output message="tns:getTimeAsStringResponse"></output>
</operation>
<operation name="getTimeAsElapsed">
<input message="tns:getTimeAsElapsed"></input>
<output message="tns:getTimeAsElapsedResponse"></output>
</operation>
</portType>


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

Publicar un comentario