• No se han encontrado resultados

8. SERVICIOS WEB (WEB SERVICES)

8.2 SERVICIOS WEB: ESTÁNDARES

8.2.5 WSDL (Web Services Description Language)

Cuando se ha realizado la introducción a los servicios se ha hablado del documento de descripción de servicio, que permitía identificar un servicio y así actuar como interfaz de comunicación con otros servicios que quisieran usarlo. Así también, gracias a este documento un servicio puede ser descubierto. Posteriormente se ha introducido el concepto de la orientación a servicios de bajo acoplamiento y cómo se conseguía gracias al contrato estandarizado y por lo tanto, a la descripción de servicio incluida en él. En el ámbito de los

74

servicios web, la implementación de un descripción de servicio se realiza con el documento WSDL que es una combinación de SOAP y XML Schema.

Un programa cliente que pretenda usar un servicio web puede leer el WSDL para determinar qué funciones están disponibles en el servicio, esto se realiza a partir del punto de contacto que permite la comunicación, a este punto de contacto se llama service endpoint y estará indicado en el WSDL. Los tipos de datos usados por las operaciones del servicio se incluyen en el archivo WSDL en forma de XML Schema. El cliente puede usar SOAP para hacer la llamada a una de las funciones listadas en el WSDL, que como hemos visto cuando se ha explicado SOAP, el nombre usado de la operación en el mensaje SOAP debe coincidir con la operación definida en el WSDL.

Una vez introducido el concepto de WSDL y su finalidad, entraremos en detalle en cómo está estructurado.

Estructura del WSDL

La estructura de un WSDL se puede diferenciar en dos categorías separadas tal y como se refleja en la Figura 48.

Fig. 48. Estructura de un WSDL. [7]

Estas dos categorías son la descripción abstracta y la descripción concreta. La descripción abstracta es la parte del WSDL que establece las interfaces del servicio, es decir, todas aquellas partes del servicio que se pueden definir sin tener en cuenta ningún tipo de tecnología en concreto. De esta forma se preserva la integridad del servicio y si en un futuro se cambia la tecnología estas partes no habrá que cambiarlas. Las partes que sí que deberían de cambiar son las de la descripción concreta, debido que en esta parte del WSDL es dónde se asocia la descripción abstracta a un tipo de tecnología en concreto, por ejemplo,

75

el protocolo de transporte usado en la comunicación. Veamos en detalle cada parte del WSDL.

Descripción abstracta

La descripción abstracta está compuesta de las siguientes secciones:

• Tipos de datos: a esta sección le corresponde la etiqueta <type>. Es donde se describen los tipos de datos usados en los mensajes. Se utiliza XML Schema para definirlos.

• Mensajes: a esta sección le corresponde la etiqueta <message>. Es la definición abstracta de los elementos del mensaje. Con los mensajes definimos los datos intercambiados en las peticiones y respuestas establecidas entre el solicitante del servicio y el servicio. En los mensajes por lo tanto, estarán definidos los parámetros y valores de retorno usados. Estos parámetros pueden definirse a partir de las estructuras creadas en la sección de tipos de datos mediante el atributo element, o se puede indicar directamente un tipo si el dato es de tipo básico, como por ejemplo un String, mediante el atributo type.

• PortType o Interface: a esta sección le corresponde la etiqueta <portType>. Es la definición abstracta de las operaciones permitidas, dentro de cada operación se definen qué mensajes se recibirán (mensajes input) o se enviarán (mensajes output). Estos mensajes serán los definidos previamente en la sección de mensajes. En función de si se puede o no recibir mensajes dentro de las operaciones, hay cuatro tipos de transmisiones permitidas, tal y como se muestra en la Figura 49.

Fig. 49. Tipos de transmisiones permitidas en el WSDL. [7]

 One-way: El servicio solamente recibe mensajes, es decir solamente tiene mensajes del tipo input.

 Request-Response: El servicio recibe un mensaje y devuelve otro mensaje de respuesta, por lo tanto tendrá un mensaje input y otro output.

76

 Solicit-Response: El proceso inverso a Request-Response, el servicio envía un mensaje y recibe una respuesta, con lo que tendrá un mensaje output y otro input.  Notification: El proceso inverso a One-way, el servicio solamente envía mensajes,

por consiguiente, tendrá solamente mensajes del tipo output.

Una vez vistas las secciones de la descripción abstracta, detallaremos las secciones de la descripción concreta.

Descripción concreta

La descripción concreta está compuesta de las siguientes secciones:

• Binding: a esta sección le corresponde la etiqueta <binding>. En esta sección se especifica un protocolo de comunicación concreto (SOAP/HTTP, HTTP GET/POST, etc…) y un formato de datos para una operación en particular. Es decir, asociamos una implementación tecnológica concreta, a las operaciones del servicio.

• Servicios: a esta sección le corresponde la etiqueta <service>. En ella se definen los puertos que especifican los endpoints. Harán referencia a un Binding. Definen pues, dónde se estará preparado para recibir/enviar mensajes.

Para ejemplificar todos estos conceptos detallados tanto en la descripción abstracta como concreta, analizaremos un WSDL de ejemplo y comentaremos cada sección:

<definitions name="StockQuote"

targetNamespace="http://example.com/stockquote.wsdl" xmlns:tns="http://example.com/stockquote.wsdl" xmlns:xsd1="http://example.com/stockquote.xsd" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns="http://schemas.xmlsoap.org/wsdl/"> <types>

<schema targetNamespace="http://example.com/stockquote.xsd"

xmlns="http://www.w3.org/2000/10/XMLSchema">

<element name="TradePriceRequest"> <complexType>

<all>

<element name="tickerSymbol" type="string"/> </all>

</complexType> </element>

<element name="TradePrice"> <complexType>

<all>

<element name="price" type="float"/> </all>

77 </complexType> </element> </schema> </types>

<message name="GetLastTradePriceInput">

<part name="body" element="xsd1:TradePriceRequest"/> </message>

<message name="GetLastTradePriceOutput">

<part name="body" element="xsd1:TradePrice"/> </message>

<portType name="StockQuotePortType">

<operation name="GetLastTradePrice">

<input message="tns:GetLastTradePriceInput"/> <output message="tns:GetLastTradePriceOutput"/> </operation>

</portType>

<binding name="StockQuoteSoapBinding"

type="tns:StockQuotePortType">

<soap:binding style="document"

transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="GetLastTradePrice">

<soap:operation

soapAction="http://example.com/GetLastTradePrice"/> <input>

<soap:body use="literal"/> </input>

<output>

<soap:body use="literal"/> </output>

</operation> </binding>

<service name="StockQuoteService">

<documentation>My first service</documentation> <port name="StockQuotePort"

binding="tns:StockQuoteSoapBinding">

<soap:address location="http://example.com/stockquote"/> </port>

</service>

</definitions>

78 Types

Se definen dos tipos de datos, TradePriceRequest que tendrá un elemento tickerSympol del tipo string (cadena de caracteres) que solo podrá aparecer una vez. Esto se define con la etiqueta <all>.

El segundo elemento definido es TradePrice que tendrá un subelemento Price del tipo float (decimal).

Message

Se definen dos mensajes el primero GetLasTradePriceInput hace referencia al elemento TradePriceRequest definido en la sección types, y GetLastTradePriceOutput que hará referencia al elemento TradePrice también definido en la sección types.

PortType

Se define la operación GetLastTradePrice dónde el mensaje de la petición será el mensaje GetLastTradePriceInput y la respuesta será el mensaje GetLastTradePriceOutput.

Por lo tanto, se está definiendo una operación dónde se enviará un identificador de valor bursátil (tickerSymbol) y se recibirá la respuesta de su valor actual en el mercado (Price). Binding

En esta sección se define el binding StockQuoteSoapBinding donde se indica que la operación GetLastTradePrice se hará sobre el protocolo HTTP/SOAP a partir del atributo

transport=http://schemas.xmlsoap.org/soap/http

Hasta este punto todo se había definido de forma abstracta, las operaciones y los mensajes. Es con el binding dónde se le da unas características concretas de protocolo de transporte. Service

Se define el endpoint donde llegaran las peticiones para el binding. El endpoint se define en: <soap:addresslocation="http://example.com/stockquote"/>

Esto significa que la petición SOAP realizada por el consumidor del servicio se deberá enviar a la URL definida en el atributo location.

79

Una vez vistos los puntos más importantes de los servicios web realizaremos una comparativa entre los principios de service-orientation y los servicios web, para ver como éstos proveen una implementación de dichos principios, y por lo tanto, para construir soluciones SOA.