Cibernetia > Manuales > Servicios web > SOAP
Búsqueda personalizada







SOAP

SOAP estandariza el intercambio de mensajes entre diferentes aplicaciones. Por eso la función básica de SOAP es definir un formato de mensajes estándar (basado en XML) que encapsulará la comunicación entre aplicaciones.

Mensajes SOAP

El formato general de un mensaje SOAP sería:

<ENVELOPE atribs>
<HEADER atribs>
<directivas />
</HEADER>
<BODY atribs>
<cuerpo />
</BODY>
<FAULT atribs>
<errores />
</FAULT>
</ENVELOPE>
  • Envelope: elemento raíz del formato SOAP.
  • Header: elemento opcional, que extiende las funcionalidades básicas de SOAP (seguridad, etc.).
  • Body: elemento contenedor de los datos del mensaje. Es obligatoria su presencia.
  • Fault: si existe error, esta sección contendrá la información sobre el tipo de error.

Hay una especificación ampliada de SOAP denominada SwA ("SOAP with Attachments") que usa la codificación MIME para el transporte de información binaria.

Un mensaje SOAP tiene este formato:

<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://www.w3.org/2001/09/soap-envelope"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Body>.
<ns1:getTiempo
xmlns:ns1="http://www.uoc.edu/soap-tiempo"
SOAP-ENV:encodingStyle
=" http://www.w3.org/2001/09/soap-encoding"
<codigopostal xsi:type="xsd:string">
25001
</codigopostal>
</ns1:getTiempo>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

El mensaje es una petición de servicio (en el ejemplo, un método de JavaBeans llamado getTiempo). Se distingue en el mensaje una parte llamada ENVELOPE, que contiene otra parte llamada Body.

Se observa que se define una llamada a un método, denominado getTiempo. Analizando el formato de la llamada:

<ns1:getTiempo
xmlns:ns1="http://www.uoc.edu/soap-tiempo"
SOAP-ENV:encodingStyle=
"http://www.w3.org/2001/09/soap-encoding"
<codigopostal xsi:type="xsd:string">
25001
</codigopostal>
</ns1:getTiempo>

Se aprecia que el método recibe un parámetro, llamado "codigopostal", del tipo cadena. SOAP permite definir parámetros de cualquiera de los tipos definidos por XSchema, además de proporcionar otros tipos propios (como SOAP:Array) y de permitir la definición de nuevos tipos.

El método getTiempo responderá con un mensaje también codificado en SOAP. El mensaje de respuesta será del tipo:

<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://www.w3.org/2001/09/soap-envelope"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Body>
<ns1:getTiempoResponse
xmlns:ns1="http://www.uoc.edu/soap-tiempo"
SOAP-ENV:encodingStyle=" http://www.w3.org/2001/09/soap-encoding
<tiempoResponse xsi:type="xsd:string">10</tiempoResponse>
</ns1:getTiempoResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Donde se aprecia en:

<ns1:getTiempoResponse
xmlns:ns1="http://www.uoc.edu/soap-tiempo"
SOAP-ENV:encodingStyle=" http://www.w3.org/2001/09/soap-encoding
<tiempoResponse xsi:type="xsd:string">10</tiempoResponse>
</ns1:getTiempoResponse>

que el servicio responde a la petición de tiempo con el valor de la temperatura. Es habitual que la estructura que contiene la respuesta se llame de igual modo que la que contiene la llamada. Además del mensaje en formato XML, SOAP define también una extensión de HTTP que consiste en una nueva cabecera para la petición de servicio. Esta cabecera es opcional a partir de la versión 1.2 de SOAP.

Desarrollo de aplicaciones SOAP

SOAP no define ninguna librería estándar que permita la programación de aplicaciones; de hecho, define solamente el formato de mensaje que deben usar las aplicaciones y ciertas directivas para la comunicación. Para ilustrar el desarrollo de un pequeño servicio de web, usaremos una de las librerías SOAP disponibles, en concreto, la librería Apache AXIS.

La librería Apache AXIS fue originariamente un producto de IBM Alphaworks, y fue posteriormente cedida a la Apache Foundation, que continuó desarrollándola bajo la licencia Apache. Para usar la librería Apache AXIS se requiere, además, Tomcat (el contenedor para Servlets de Apache) y Xerces (el analizador de XML de Apache).

Veamos un sencillo servicio web utilizando Apache AXIS. Se utilizan unos nombres de método y de parámetros que coincidirán con un método real que (XMethods) aloja en su servidor y para el cual existe libre acceso.

Se define primero una interfaz de Java:

public interface IExchange
{
float getRate( String country1, String country2 );
}

La interfaz (IExchange) calcula la tasa de cambio entre dos monedas para dos países. No es necesario implementar la interfaz en caso de Apache AXIS, pero el uso interfaces puede ser necesario para APIs diferentes de SOAP.

Veamos un ejemplo de implementación "ficticia" de esta interfaz:

public class Exchange implements IExchange
{
public float getRate( String country1, String country2 )
{
System.out.println( "getRate( "+ country1 +
", "+ country2 + ")" );
return 0.8551F;
}
}

Ya es posible desplegar el servicio en Apache AXIS. La forma de desplegarlo dependerá de las librerías que se utilicen, y por eso será preciso consultarlas. En general no será preciso realizar acciones adicionales, siendo las propias librerías las encargadas, normalmente, de la generación del fichero WSDL, la publicación en directorio, etc.

El código necesario para la invocación de este servicio sería:

import java.net.*;
import java.util.*;

// Clases que guardan relación con el mensaje
import org.apache.soap.*;
// Clases que guardan relación con las llamadas
import org.apache.soap.rpc.*;

public class Client
{
public static void main( String[] args ) throws Exception
{
// Dirección del servicio de Apache SOAP
URL url = new URL(
"http://miservidor:8080/soap/servlet/rpcrouter" );
// Identificador del servicio. Proporcionado
// al desplegar este
String urn = "urn:demo:cambio";
// Prepara invocacion del servicio
Call call = new Call();
call.setTargetObjectURI( urn );
call.setMethodName( "getRate" );
call.setEncodingStyleURI( Constants.NS_URI_SOAP_ENC );
// Parametros
Vector params = new Vector();
params.addElement(
new Parameter( "country1",
String.class, "USA", null ) );
params.addElement(
new Parameter( "country2",
String.class, "EUR", null ) );
call.setParams( params );
try
{
System.out.println(
"invocamos service\n"
+ " URL= " + url
+ "\n URN ="
+ urn );
// invocamos
Response response = call.invoke( url, "" );
// Hay fallo?
if( !response.generatedFault() )
{
// NO HAY FALLO
Parameter result = response.getReturnValue();
System.out.println( "Result= " + result.getValue() );
}
else
{
// HAY FALLO
Fault f = response.getFault();
System.err.println( "Fault= "
+ f.getFaultCode() + ", "
+ f.getFaultString() );
}
}
// La llamada ha tenido problemas
catch( SOAPException e )
{
System.err.println(
"SOAPException= " + e.getFaultCode()
+ ", " + e.getMessage() );
}
}
}

Los manuales titulados Introducción a las aplicaciones web, Instalación del servidor web y Servicios web han sido extraídos, con algunas modificaciones, del manual "Desarrollo de aplicaciones web", publicado por la UOC dentro de su máster de software libre, escrito por Carles Mateu i Piñol.

El manual tiene licencia GFDL, la cual otorga permiso para copiar, distribuir y modificar el documento según los términos de la GNU Free Documentation License, Version 1.2 o cualquiera posterior publicada por la Free Software Foundation, sin secciones invariantes ni textos de cubierta delantera o trasera.

Se puede acceder al documento original en: http://www.uoc.edu/masters/esp/img/873.pdf (versión imprimible) y http://www.uoc.edu/masters/esp/img/692.zip (versión editable, formato zip).

Manuales | Tesis: Ordenadores, Circuitos integrados...
english
Cibernetia