Introducción a los Servicios Web en Java

Seguro que habr�s o�do el bombardeo publicitario, y probablemente estar�s aturdido con todos los acr�nimos. Por eso �qu� son los Servicios Web y C�mo podemos utilizarlos?. Este tutorial intentar� desmitificar los Servicios Web y mostrar�, paso a paso, c�mo construirlos, desplegarlos, usarlos y encontrarlos.

Los Servicios Web b�sicos no son muy dificiles de crear. Para probar este punto, te mostraremos, en esta primera p�gina, como construir un Servicio Web en unos 30 minutos. En las siguientes p�ginas profundizaremos algo m�s en los Servicios web y explicaremos los siguientes t�picos en m�s detalle:

  • La mensajer�a SOAP.
  • Las definiciones WSDL y su relaci�n con el c�digo.
  • Publicaci�n de Servicios en un directorio UDDI.
  • Exponer aplicaciones legales como Servicios Web.
  • T�picos avanzados, como la seguridad.

En esta primera p�gina, empezaremos con una definici�n program�tica de los Servicios Web, luego mostraremos una simple clase Java que llama y ejecuta un Servicio Web. Hemos creado nuestros ejemplos usando un conjunto de herramientas gratuitas de Systinet (los detalles de c�mo acceder y descarga este software est�n en la secci�n Instalar el Software). No tienes porqu� utilizar estos productos para entender los ejemplos, pero te lo recomendamos. Los conceptos presentados y el c�digo que hemos creado se puede aplicar de forma general y es relativamente independiente de las herramientas utilizadas. Asumimos alg�n conocimiento de XML pero ninguno de Servicios Web.

Creemos que J2EE es la arquitectura m�s madura para la implementaci�n de la l�gica de negocios, y nuestro objetivo es presentar los Servicios Web como una extensi�n natural del modelo de componentes existente en J2EE, proporcionando un protocolo basado en XML como est�ndar industrial. Esto le da a los sistemas existentes basados en J2EE mucho m�s alcance que antes y hace de J2EE una mucho mejor opci�n para la implementaci�n de la l�gica de negocio principal dentro de los entornos t�picamente heterog�neos de sistemas de informaci�n corporativa.

.�El Servicio Web - una Definici�n Program�tica

Un Servicio Web es un componente software con las siguientes caracter�sticas:

  • Es accesible a trav�s del interface SOAP (Simple Object Access Protocol).
  • Su interface se describe en un documento WSDL (Web Service Description Language).

SOAP es un protocolo de mensajer�a XML extensible que forma la base de los Servicios Web. SOAP proporciona un mecanismo simple y consistente que permtie a una aplicaci�n enviar mensajes XML a otra aplicaci�n. Un mensaje SOAP es una transmisi�n de una-via desde un emisor SOAP a un receptor SOAP, y cualquier aplicaci�n puede participar en este intercambio como emisor o receptor. Los mensajes SOAP se pueden combinar para soportar muchos comportamientos de comunicaci�n, incluyendo, solicitud/respuesta, respuesta solicitada, mensajer�a as�ncrona de una-v�a, o incluso notificaci�n. SOAP es un protocolo de alto nivel que s�lo define la estuctura del mensaje y unas pocas reglas para su procesamiento. Es completamente independiente del protocolo de transporte subyacente, por eso los mensajes SOAP se pueden intercambiar sobre HTTP, JMS o protocolos de transporte de e-mail. Actualmente el protocolo HTTP es el m�s utilizado para los mensajes HTTP.

WSDL es un documento XML que contiene un conjunto de definiciones que describen un Servicio Web. Proporciona toda la informaci�n necesaria para acceder y utilizar un Servicio Web. Un documento WSDL describe qu� hace el Servicio Web, c�mo se comunica, y d�nde reside. Usamos el documento WSDL en el momento del despliegue para crear nuestros interfaces de servicio. Algunas implementaciones SOAP, incluyendo WASP de Systinet, tambi�n usan WSDL durante la ejecuci�n para soportar comunicaciones din�micas.

.�Instalar el Software

REQUERIMIENTOS: Asumimos que tienes instalada una versi�n del SDK superior a la 1.3, y que dispones de un navegador HTTP est�ndar. La variable de entorno JAVA_HOME deber�a apuntar al directorio de instalaci�n del SDK.

Si quieres probar los ejemplos, del tutorial, necesitar�s descargar WASP Advanced de Systinet. Descomprime el paquete descargado en tu disco duro (preferiblemente en C:) y ejecuta el script install del subdirectorio bin de la instalaci�n de WASP Advanced.

En nuestros ejemplos asumimos que has desempaquetado WASP en el directorio c:\wasp-advanced.

Tambi�n necesitar�s descargar el c�digo fuente y descomprimirlo en el directorio c:\wasp_demo.

Si eliges nombres diferentes de directorios, por favor, actualiza el script env.bat de la forma apropiada (cambia las variables de entorno WASP_HOME y WASP_DEMO para que apunten respectivamente al directorio de instalaci�n de WASP y al directorio de la demo).

.�Implementar un Sencillo Servicio Web

Seguiremos estos pasos para crear nuestro sencillo Servicio Web:

  • Crear la l�gica del negocio del Servicio Web. Primero necesitamos escribir una clase Java que implemente la l�gica de negocio del servicio Web. En este caso, nuestra l�gica de negocio ser� un simple clase Java que simula una servicio de citas de stocks.
  • Desplegar la clase Java en el servidor SOAP. Luego necesitamos convertir la clase Java en un Servicio Web. Mostraremos como desplegar la clase Java en un servidor SOAP usando la heramienta de despliegue de WASP.
  • Generar las clases de acceso para los clientes. Una aplicaci�n cliente usa un objeto proxy para acceder al Servicio Web. En el momento de la solicitud, el proxy acepta una llamada a un m�todo Java desde la aplicaci�n y la traduce en un mensaje XML. En el momento de la respuesta, el proxy recibe el mensaje de respuesta SOAP, lo traduce en objetos Java y devuelve el resultado a la aplicaci�n cliente.
  • Desarrollar la aplicaci�n cliente. La aplicaci�n cliente trata el proxy como un objeto Java est�ndar que facilita la comunicaci�n con un Servicio Web.

Empecemos con una simple clase Java que implementa la funci�n de b�squeda de un servidor de Stocks:

/*
 * StockQuoteService.java
 *
 * Created on Sat 13th Oct 2001, 15:25
 */

package com.systinet.demos.stock;

/**
 * Simple stock quote service
 * @author  zdenek
 * @version 1.0
 */
public class StockQuoteService {

    
    public double getQuote(String symbol) {
        if(symbol!=null && symbol.equalsIgnoreCase("SUNW"))
            return 10;
        if(symbol!=null && symbol.equalsIgnoreCase("MSFT"))
            return 50;
        if(symbol!=null && symbol.equalsIgnoreCase("BEAS"))
            return 11;
        return 0;    
    }
    
    public java.util.LinkedList getAvailableStocks() {
        java.util.LinkedList list = new java.util.LinkedList();
        list.add("SUNW");
        list.add("MSFT");
        list.add("BEAS");
        return list;
    }

}

Nuestro ejemplo es el tan manido sistema servidor de stocks (ya hemos visto muchos de estos, los desarrolladores deber�an pagar un impuesto por su utilizaci�n), pero ilustra lo f�cil que se puede crear y desplegar un servicio Web. En nuestro ejemplo, vamos a recuperar los precios de tres stocks (BEAS, MSFT, y SUNW).

La forma m�s f�cil de convertir nuestra clase en un servicio Web es compilar nuestras clases y luego usar la herramienta de despliegue para desplegarlas en el entorno de ejecuci�n de Servicio Web.

Primero arrancamos el entorno de Servicios Web con el script startserver.bat. Luego compilamos StockQuoteService.java y desplegamos la clase compiladas al servidor SOAP usando el script deploy.bat.

Luego nos aseguramos de que todo funciona correctamente abriendo la consola de administraci�n introduci�ndo est� direcci�n en nuestro navegador http://localhost:6060/admin/console. Pulsamos sobre el bot�n Refresh para ver una lista de todos los paquetes desplegados en el servidor. Deber�amos ver el paquete StockService con un StockQuoteService desplegado en el servidor. Observa que el entorno de ejecuci�n de Servicios Web ha generado autom�ticamente el fichero WSDL y lo publica en la direcci�n http://localhost:6060/StockQuoteService/.

Aqu� tenemos el fichero WSDL generado autom�ticamente:

<?xml version='1.0'?>
<wsdl:definitions name='com.systinet.demos.stock.StockQuoteService' 
targetNamespace='http://idoox.com/wasp/tools/java2wsdl/output/com/systinet/demos/stock/'
    xmlns:mime='http://schemas.xmlsoap.org/wsdl/mime/'
    xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/'
    xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/'
    xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
    xmlns:xsd='http://www.w3.org/2001/XMLSchema'
    xmlns:ns0='http://idoox.com/containers'
    xmlns:http='http://schemas.xmlsoap.org/wsdl/http/'
    xmlns:tns='http://idoox.com/wasp/tools/java2wsdl/output/com/systinet/demos/stock/'
    xmlns:SOAP-ENC='http://schemas.xmlsoap.org/soap/encoding/'>
    <wsdl:message name='StockQuoteService_getQuote_Request'>
        <wsdl:part name='p0' type='xsd:string'/>
    </wsdl:message>
    <wsdl:message name='StockQuoteService_getQuote_Response'>
        <wsdl:part name='response' type='xsd:double'/>
    </wsdl:message>
    <wsdl:message name='StockQuoteService_getAvailableStocks_Request'/>
    <wsdl:message name='StockQuoteService_getAvailableStocks_Response'>
        <wsdl:part name='response' type='ns0:LinkedList'/>
    </wsdl:message>
    <wsdl:portType name='StockQuoteService'>
        <wsdl:operation name='getAvailableStocks'>
            <wsdl:input name='getAvailableStocks' 
                message='tns:StockQuoteService_getAvailableStocks_Request'/>
            <wsdl:output name='getAvailableStocks' 
                message='tns:StockQuoteService_getAvailableStocks_Response'/>
        </wsdl:operation>
        <wsdl:operation name='getQuote' parameterOrder='p0'>
            <wsdl:input name='getQuote' 
                message='tns:StockQuoteService_getQuote_Request'/>
            <wsdl:output name='getQuote' 
                message='tns:StockQuoteService_getQuote_Response'/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name='StockQuoteService' type='tns:StockQuoteService'>
        <soap:binding transport='http://schemas.xmlsoap.org/soap/http' style='rpc'/>
        <wsdl:operation name='getAvailableStocks'>
            <soap:operation soapAction='' style='rpc'/>
            <wsdl:input name='getAvailableStocks'>
                <soap:body use='encoded' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' 
        namespace='http://idoox.com/wasp/tools/java2wsdl/output/com/systinet/demos/stock/'/>
            </wsdl:input>
            <wsdl:output name='getAvailableStocks'>
                <soap:body use='encoded' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' 
        namespace='http://idoox.com/wasp/tools/java2wsdl/output/com/systinet/demos/stock/'/>
            </wsdl:output>
        </wsdl:operation>
        <wsdl:operation name='getQuote'>
            <soap:operation soapAction='' style='rpc'/>
            <wsdl:input name='getQuote'>
                <soap:body use='encoded' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' 
        namespace='http://idoox.com/wasp/tools/java2wsdl/output/com/systinet/demos/stock/'/>
            </wsdl:input>
            <wsdl:output name='getQuote'>
                <soap:body use='encoded' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' 
        namespace='http://idoox.com/wasp/tools/java2wsdl/output/com/systinet/demos/stock/'/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name='JavaService'>
        <wsdl:port name='StockQuoteService' binding='tns:StockQuoteService'>
            <soap:address location='http://localhost:6061/StockQuoteService/'/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

El fichero WSDL contiene una descripci�n total del Servicio Web desplegado. B�sicamente hay tres partes en un fichero WSDL:

  • La parte QUE, consta de elementos types, message, y portType, define el mensaje y los tipos de datos intercambiados entre el cliente y el servidor. Un message es el elemento de comunicaci�n b�sico de SOAP. Un mensaje puede constar de una o m�s partes, cada parte representa un par�metro con tipo. Hay dos mensajes (entrada y salida) por cada m�todo de nuestra clase Java del servicio de Stocks. Como no usamos ning�n tipo complejo o compuesto, no hay definiciones de tipos compuestos en este WSDL (no te preocupes, veremos muchos de ellos en otros ejemplos). Todos los mensajes se agrupan en operations en una entidad llamada portType. Un portType representa el interface -- un conjunto concreto de operaciones soportadas por el Servicio Web. Un Servicio Web puede tener varios interfaces representados por distitnos portTypes. Mira el portType, StockQuoteService en el fichero WSDL de ejemplo. Incluye dos operaciones: getAvailableStocks y getQuote. Para invocar al m�todo getQuote, el cliente env�a un mensaje StockQuote_getQuote_Request. (Encontraras la definici�n m�s abajo en el fichero). Observa que el mensaje StockQuote_getQuote_Request consta de una part (el par�metro de entrada) llamado p0, que est� definido como un tipo string del esquema XML (xsd:string). Se supone que el Servicio Web responder� con el mensaje StockQuote_getQuote_Response, que contiene una part (el valor de retorno) llamado response, que es del tipo double del esquema XML (xsd:double).
  • La parte COMO, consta de elementos binding, describe los detalles de la implementaci�n t�cnica de nuestro Servicio Web. Un binding une un portType a un protocolo de comunicaci�n (en este caso, SOAP sobre HTTP). Como estamos usando SOAP, usamos varios elementos de extensibilidad SOAP para WSDL para definir las especifidades de nuestra uni�n SOAP. (Observa que muchos de los elementos de esta secci�n usan el prefijo del espacio de nombres soap:. Estos elementos son extensiones SOAP para WSDL. El atributo soapAction del elemento soap:operation es un atributo espec�fico-HTTP que se puede utilizar para especificar el prop�sito de un mensaje SOAP. Puede contener un par�metro de enrutamiento del mensaje o un valor que ayude al entorno de ejecuci�n SOAP a determinar qu� aplicaci�n o m�todo se deber�a ejecutar. El valor especificado por este atributo tambi�n se debe especificar en el atributo SOAPAction: de la cabecera HTTP del mensaje de solicitud SOAP. En nuestro caso este atributo no contiene ning�n valor. Una uni�n SOAP requiere que especifiquemos el estilo de comunicaci�n usado para cada operaci�n en el portType. SOAP soporta dos estilos de comunicaci�n: RPC y Document. El estilo RPC soporta formaci�n y deformaci�n autom�tica de mensajes, permitiendo a los desarrolladores expresar una solicitud como una llamada a m�todo con un conjunto de par�metros, que devuelve una respuesta que contiene un valor de retorno. El estilo Document no soporta formaci�n autom�tica de mensajes. Asume que los contenidos del mensaje SOAP son datos XML bien-formateados. Una uni�n SOAP tambi�n requiere que especifiquemos como se expresan los mensajes en XML. Podemos usar valores literal o tipos de datos encoded. El atributo use='literal' indica que el entorno de ejecuci�n SOAP deber�a enviar el XML como se le ha proporcionado. El atributo use='encoded' indica que el entorno de ejecuci�n SOAP deber�a serializar los datos por nosotros usando un estilo de codificaci�n particular. Una estilo de codificaci�n define un conjunto de reglas para expresar tipo de un lenguaje de programaci�n en XML. En este caso hemos usado el estilo de codificaci�n definido en la secci�n 5 de la especificaci�n SOAP. Aunque tambi�n se puede utilizar otros estilos de codificaci�n.
  • Finalmente, la parte DONDE, consta del elemento service, colocando juntos el porttype, el binding, y la localizaci�n real (una URI) del Servicio Web. Chequea el elemento service al final del documento WSDL.

Como puedes ver, un fichero WSDL describe completamente un Servicio Web. Dando un fichero WSDL, tenemos toda la informaci�n necesaria para crear una aplicaci�n cliente que pueda acceder a nuestro Servicio Web de Stocks.

.�Implementar un Cliente Java de un Servicio Web

Un cliente se bind(une) a un Servicio Web remoto usando un componente proxy Java, Cuando se utiliza WASP de Systinet, este proxy se genera en tiempo de ejecuci�n desde el fichero WSDL. Necesitamos un interface Java que pueda mantener una referencia a este objeto creado din�micamente. Podemos crear el interface nosotros mismos, o podemos usar el WSDLCompiler de WASP para que genere uno por nosotros. La creaci�n del interface es sencilla porque el �nico requerimiento es que los m�todos del interface deben ser un subconjunto de los m�todos de la clase Java de la l�gica de negocio del Servicio Web. Echemos una mirada al c�digo de abajo. Primero, el cliente crea un objeto WebServiceLookup. Este objeto se utiliza entonces para crear el proxy del Servicio Web invocando el m�todo lookup. Este m�todo requiere dos par�metros: una referencia al fichero WSDL y la clase del interface Java que referenciar� el ejemplar proxy. El m�todo lookup devuelve el proxy que se utiliza para invocar el Servicio Web.

/**
 * Stock Client
 *
 * @created July 17, 2001
 * @author zdenek
 */

package com.systinet.demos.stock;

import org.idoox.wasp.Context;
import org.idoox.webservice.client.WebServiceLookup;

public class StockClient {

  /**
   * Web service client main method.
   * Finds the web service and 
   * @param args  not used.
   */
    public static void main( String[] args ) throws Exception {
        
      // lookup service
      WebServiceLookup lookup = (WebServiceLookup)Context.getInstance(Context.WEBSERVICE_LOOKUP);
      // bind to StockQuoteService
      StockQuoteServiceProxy quoteService = (StockQuoteServiceProxy)lookup.lookup(
        "http://localhost:6060/StockQuoteService/",
        StockQuoteServiceProxy.class
      );
      

      // use StockQuoteService
      System.out.println("Getting available stocks");
      System.out.println("------------------------");
      java.util.LinkedList list = quoteService.getAvailableStocks();
      java.util.Iterator iter = list.iterator();
      while(iter.hasNext()) {
         System.out.println(iter.next());
      }
      System.out.println("");
      
      System.out.println("Getting SUNW quote");
      System.out.println("------------------------");
      System.out.println("SUNW "+quoteService.getQuote("SUNW"));
      System.out.println("");
      
    }

}

Ejecutamos el script runJavaclient.bat. Este script ejecutar� el WSDLcompiler para generar el interface Java, luego lo compilar� y ejecutar� la aplicaci�n cliente. Deber�as ver la salida de los m�todos getAvailableStocks y getQuote en la consola.

.�Desplegar y Ejecutar el Servicio Web JavaScript

Nota:
Por favor, observa que el Cliente del Servicio Web JavaScript necesita Microsoft Internet Explorer 6.0 o Microsoft Internet Explorer 5.0 con Microsoft XML Parser 3.0 SP2.

Podemos generar un cliente JavaScript basado en navegador usando el script runJScriptClient.bat. Este script abrir� un navegador IE con una p�gina HTML. Entonces podremos invocar todos los m�todos del Servicio Web desde esta p�gina.

.�Mensajes SOAP de un Vistazo

Ahora podemos usar la consola de administraci�n de WASP para ver los mensajes SOAP que se han intercambiado entre el cliente y el servidor. Primero debemos abrir la consola introduciendo esta direcci�n http://localhost:6060/admin/console en nuestro navegador. Luego pulsamos sobre el bot�n Refresh para ver todos los paquetes desplegados. Deber�amos ver como nuestro servicio StockQuoteService est� desplegado en el servidor. Activamos la depuraci�n de todos los mensajes SOAP pulsando el enlace "enable" (cerca de la etiqueta "Debug is OFF:" en la secci�n StockQuoteService de la consola de administraci�n). Luego volvemos a ejecutar el script del cliente del Servicio Web runJavaclient.bat y pulsamos sobre el enlace show SOAP conversation en la consola de administraci�n. Esto deber�a abrir una ventana de navegador que muestra dos parejas de mensajes SOAP de entrada y salida:

==== INPUT ==== http://localhost:6060/StockQuoteService/ ==== 11/7/01 3:45 PM =
<?xml version="1.0" encoding="UTF-8"?>
<ns0:Envelope xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/">
  <ns0:Body 
    ns0:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
    <ns0:getAvailableStocks 
        xmlns:ns0="http://idoox.com/wasp/tools/java2wsdl/output/com/systinet/demos/stock/"/>
  </ns0:Body>
</ns0:Envelope>
==== CLOSE ===================================================================== 

==== OUTPUT ==== http://localhost:6060/StockQuoteService/ ======================
<?xml version="1.0" encoding="UTF-8"?>
<ns0:Envelope xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/">
  <ns0:Body 
    ns0:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
    <ns0:getAvailableStocksResponse 
        xmlns:ns0="http://idoox.com/wasp/tools/java2wsdl/output/com/systinet/demos/stock/">
    <response xsi:type="ns1:LinkedList" xmlns:ns1="http://idoox.com/containers">
        <item xsi:type="xsd:string">SUNW</item>
        <item xsi:type="xsd:string">MSFT</item>
        <item xsi:type="xsd:string">BEAS</item>
    </response>
    </ns0:getAvailableStocksResponse>
  </ns0:Body>
</ns0:Envelope>
==== CLOSE ===================================================================== 

==== INPUT ==== http://localhost:6060/StockQuoteService/ ==== 11/7/01 3:45 PM =
<?xml version="1.0" encoding="UTF-8"?>
<ns0:Envelope xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/">
  <ns0:Body 
    ns0:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
    <ns0:getQuote 
      xmlns:ns0="http://idoox.com/wasp/tools/java2wsdl/output/com/systinet/demos/stock/">
      <p0 xsi:type="xsd:string">SUNW</p0>
    </ns0:getQuote>
  </ns0:Body>
</ns0:Envelope>
==== CLOSE ===================================================================== 

==== OUTPUT ==== http://localhost:6060/StockQuoteService/ ======================
<?xml version="1.0" encoding="UTF-8"?>
<ns0:Envelope xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/">
  <ns0:Body 
    ns0:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
    <ns0:getQuoteResponse 
        xmlns:ns0="http://idoox.com/wasp/tools/java2wsdl/output/com/systinet/demos/stock/">
      <response xsi:type="xsd:double">10.0</response>
    </ns0:getQuoteResponse>
  </ns0:Body>
</ns0:Envelope>
==== CLOSE =====================================================================

Los mensajes SOAP siguen la siguiente estructura b�sica:

<ENVELOPE attrs>
  <HEADER attrs>
    <directives/>
  </HEADER>
  <BODY attrs>
    <payload/>
  </BODY>
  <FAULT attrs>
    <errors/>
  </FAULT>
</ENVELOPE>

El contenido del mensaje est� encerrado en el ENVELOPE. En este caso sencillo, nuestros mensajes SOAP, s�lo contienen una secci�n BODY. Tambi�n puede haber otras dos secciones, llamadas HEADER y FAULT. La secci�n HEADER normalmente se usa para la propagaci�n de distinta informaci�n de contexto (por ejemplo, contexto de transaci�n, credienciales de seguridad, etc.). Si ocurre un error, la secci�n FAULT deber�a portar informaci�n sobre la naturaleza del fallo. La secci�n BODY contiene la informaci�n importante (en nuestro ejemplo, el valor del stock y datos relacionados). Generalmente, SOAP no obliga a ninguna regla para la secci�n BODY. Ya hemos mencionado dos posibles estilos para la secci�n BODY: Document y RPC. El estilo Document no tiene requerimientos de formateo r�gios m�s all� de las reglas est�ndar del XML, mientras que el estilo RPC define reglas para marcar la llamada a m�todo con todos sus par�metros. La especificaci�n SOAP recomienda pero no obliga al estilo codificado, el marco de trabajo b�sico para expresar valores tipados en un mensaje SOAP. El estilo de codificaci�n SOAP est� basado en los tipos de datos definidos en el "La Parte 2 de la Recomendaci�n del Esquema XML" que incluye tipos primitivos como int, float, double o string. La codificaci�n SOAP tambi�n define reglas para construir tipos complejos (por ejemplo arrays, estructuras, etc.) sobre estos tipos primitivos. En nuestro caso (est�mos usando el estilo RPC con codificaci�n SOAP), la secci�n BODY del mensaje de entrada contiene el nombre del m�todo invocado con los par�metros codificados:

<ns0:getQuote xmlns:ns0="http://idoox.com/wasp/tools/java2wsdl/output/com/systinet/demos/stock/">
  <p0 xsi:type="xsd:string">SUNW</p0>
</ns0:getQuote>

El mensaje de salida contiene el resultado de la llamada al m�todo:

<ns0:getQuoteResponse 
  xmlns:ns0="http://idoox.com/wasp/tools/java2wsdl/output/com/systinet/demos/stock/">
  <response xsi:type="xsd:double">10.0</response>
</ns0:getQuoteResponse>

.�Limpieza

Al final debemos eliminar nuestro sencillo servicio del servidor ejecutando el script undeploy.bat.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO