There's some very basic support for XEP-0072: SOAP Over XMPP. For more details you should read the specification. Here are some examples.
boolean isSupported = xmppClient.isSupported("http://jabber.org/protocol/soap", Jid.of("responder@example.com/soap-server"));
The following code creates a SOAP envelope and adds it as extension to a message (IQ-set could be used as well).
MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
SOAPMessage soapMessage = messageFactory.createMessage();
SOAPPart soapPart = soapMessage.getSOAPPart();
// SOAP Envelope
SOAPEnvelope envelope = soapPart.getEnvelope();
envelope.addNamespaceDeclaration("p", "http://travelcompany.example.org/reservation/travel");
// SOAP Body
SOAPBody soapBody = envelope.getBody();
SOAPElement soapBodyElem1 = soapBody.addChildElement("departing", "p");
soapBodyElem1.addTextNode("New York");
SOAPElement soapBodyElem2 = soapBody.addChildElement("arriving", "p");
soapBodyElem2.addTextNode("Los Angeles");
Message message = new Message(Jid.of("juliet@example.net"));
message.addExtension(envelope);
This will generate the following XML on the XMPP stream.
<message to="juliet@example.net">
<env:Envelope xmlns:p="http://travelcompany.example.org/reservation/travel" xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Header></env:Header>
<env:Body>
<p:departing>New York</p:departing>
<p:arriving>Los Angeles</p:arriving>
</env:Body>
</env:Envelope>
</message>
Since SOAPEnvelope
is an interface and not known to the JAXB Context, it will be converted to org.w3c.Element
. You
should ask the extension for Element
and check its namespace. If it matches a SOAP namespace, you can convert it
to SOAPEnvelope
.
Element element = message.getExtension(Element.class);
MessageFactory messageFactory = null;
if (SOAPConstants.URI_NS_SOAP_1_2_ENVELOPE.equals(element.getNamespaceURI())) {
messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
} else if (SOAPConstants.URI_NS_SOAP_1_1_ENVELOPE.equals(element.getNamespaceURI())) {
messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
}
if (messageFactory != null) {
SOAPMessage soapMessage = messageFactory.createMessage();
soapMessage.getSOAPPart().setContent(new DOMSource(element));
SOAPEnvelope envelope = soapMessage.getSOAPPart().getEnvelope();
// ...
}