Excuse me... I having a doubt..
Can an handler modify the body of a SOAP message??
The Book "J2EE Web Services" by Richar Monson-Haefel says
"Neither SOAP 1.1 nor the BP explicity prohibits intermediaries from modifying
the contents of the Body element. As a result, the ultimate reciever has no way
of knowing if the application specific data has changed somewhere along the
message path. SOAP 1.2 reduces this uncertainty by explictly prohibiting
certain intermediaries, called forwarding intermediaries, from changing the
contents of the Body element and recommeding that all other intermediaries,
called active intermiediaries, use a header block to document any chances to
the Body element"
Can anyone help me please??
-----Original Message-----
From: Antonio Iossa
Sent: Mon 1/1/2007 2:12 PM
To: [email protected]
Cc:
Subject: Modify the SOAP Body before a Stub send it
Hi all!
I'm new to Axis. I would modify the body of a SOAP message *before*
axis (client-side) send it to a Web Service.
First of all, I wrote a simple Echo WS:
public class MyServerOne {
public String echo(String msg) {
System.out.println("In the WS - Server Side");
return "ECHO: % " + msg + " %";
}
}
and I deployed it with the following WSDD:
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="MyServerOne" provider="java:RPC">
<parameter name="className" value="wsSamlTest.server.MyServerOne"/>
<parameter name="allowedMethods" value="echo"/>
<parameter name="scope" value="Request"/>
</service>
</deployment>
Further, I developed a simple client-side handler:
public class myClientHandler extends BasicHandler {
public void invoke(MessageContext msgContext) throws AxisFault {
try {
SOAPEnvelope env = msgContext.getRequestMessage().
getSOAPEnvelope();
SOAPBody body = env.getBody();
System.out.println("VALUE before: " +
body.
getFirstChild().
getFirstChild().
getFirstChild().
getNodeValue() );
//set the new value:
body.
getFirstChild().
getFirstChild().
getFirstChild().
setNodeValue("new value");
System.out.println("VALUE AFTER: " +
body.
getFirstChild().
getFirstChild().
getFirstChild().
getNodeValue() );
} catch (SOAPException ex) {
ex.printStackTrace();
throw new AxisFault("myClientHandler",ex);
} catch (DOMException ex) {
ex.printStackTrace();
throw new AxisFault("myClientHandler",ex);
}
}
}
I deployed the previous handler on the flow with the following WSDD:
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<transport name="http"
pivot="java:org.apache.axis.transport.http.HTTPSender"/>
<globalConfiguration>
<requestFlow>
<handler type="java:wsSamlTest.client.myClientHandler" >
</handler>
</requestFlow>
</globalConfiguration >
<transport name="java"
pivot="java:org.apache.axis.transport.java.JavaSender"/>
<transport name="http"
pivot="java:org.apache.axis.transport.http.HTTPSender"/>
<transport name="local"
pivot="java:org.apache.axis.transport.local.LocalSender"/>
</deployment>
The output of the client-side handler is the following:
VALUE before: Original value
VALUE after: new value
But the SOAP message sent is the following:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<ns1:echo
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:ns1="http://server.wsSamlTest">
<msg xsi:type="soapenc:string" xmlns:soapenc=
"http://schemas.xmlsoap.org/soap/encoding/">
Original value
</msg>
</ns1:echo>
</soapenv:Body>
</soapenv:Envelope>
Where I mistake?
Thanks all in advance... and happy new year!
Antonio