Escribir clientes para aceder a servicios SOAP orientados a mensaje requiere que interact�emos con un conjunto de APIs de Apache SOAP de nivel m�s bajo que lo usados para escribir un cliente SOAP basado en RPC. Sin embargo, los servicios orientados a mensaje nos proporcionan un control m�s fino sobre lo que realmente se est� transmitiendo sobre SOAP. (De hecho, el mecanismo RPC esta construido sobre esta capa orientada a mensaje).
Los pasos b�sicos para crear un cliente que interact�a con un servicio orientado a mensaje son los siguientes:
- Obtener la descripci�n del interface del servicio SOAP, para que sepamos la forma que deber�a tener el mensaje SOAP (es decir, qu� cabeceras, c�mo deber�a ser el cuerpo, etc.) as� como el tipo del intercambio de mensaje que tendr� lugar
Podemos buscar el servicio en un fichero WSDL (o en alg�n otro formato de definici�n de interfaces), o directamente en su implementaci�n. Al contrario que SOAP RPC, no hay un patr�n de intercambio de mensaje predefinido, por eso un servicio orientado a mensaje podr�a devolver un SOAP envelope, podr�a devolver cualquier otro tipo de datos, o podr�a no devolver nada.
- Constuirmos un org.apache.soap.Envelope que contenga la infomaci�n que requiere el servicio SOAP.
Al final del todo, necesitaremos a�adir un objeto org.apache.soap.Body al envelope. Tambi�n podemos a�adirle cabeceras opcionalmente.
Nota: Cuando el mensaje es recibido en el servidor, es enrutado al servicio apropiado buscando en el espacio de nombres XML asociado con el primer elemento hijo del cuerpo, y luego al correcto m�todo/funci�n dentro del servicio mediante el nombre del propio elemento. - Creamos un objeto org.apache.soap.messaging.Message.
Si necesitamos a�adir attachments MIME a nuestro mensaje, podemos usar el m�todo addBodyPart(...) para hacer esto. Si necesitamos env�ar nuestro mensaje sobre un transporte distinto a HTTP, necesitaremos invocar al m�todo setSOAPTransport(...).
- Invocar al m�todo send(...) del objeto Message, proporcionando la URL del punto final que est� proporcionando el servicio (por ejemplo, http://localhost/soap/servlet/messagerouter), el actionURI, y nuestro envelope.
- Si nuestro servicio devuelve datos y asumiendo que el transporte soporte interacci�n de dos v�as, entonces necesitamos recuperar el objeto SOAPTransport desde el objeto Message (asumiendo que no lo hayamos manejado ya) usando el m�todo getSOAPTransport(). Entonces podemos invocar al m�todo receive() del objeto SOAPTransport para recuperar los datos devueltos.
Si el servicio devuelve un SOAP Envelope, podemos analizar el XML y pasar el elemento ra�z al m�todo unmarshall(...) de org.apache.soap.Envelope para permitir su reconstrucci�n como un objeto SOAP Envelope. Si ocurre un error durante el procesamiento de la solicitud, el servidor enviar� de vuelta autom�ticamente un SOAP Envelope con SOAP Fault en el cuerpo describiendo que es lo que fue mal.