 Tutoriales
El API Apache SOAP v2.2
Escribir Clientes de Message
Cliente Message
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.
|
|
|