Spot the difference
Below are two SOAP messages that are only subtly different when you look at the XML text, but the way how they “want to be treated” at the endpoint differs quite dramatically. The first targets a data-item/record/object and triggers a method, while the second targets an interface/endpoint/API and triggers a function/procedure.
The first message carries an out-of-band reference that is in the header, the second has that same reference inside the body. The first is a bit like how the implicit “this pointer” argument is passed “invisibly” to a C++ or C# method, the second is like passing an explicit context argument in C or (classic) Pascal or any other procedural language. The first binds to logic belonging to a specific object, the second binds to some object-neutral handling logic.
[1]
<soap:Envelope xmlns:soap=”http://www.w3.org/2003/05/soap-envelope”
xmlns:wsa=”http://schemas.xmlsoap.org/ws/2004/08/addressing”>
<soap:Header>
<wsa:To>http://www.example.org/Giro/Transfer</wsa:To>
<my:Account xmlns:my=”http://schemas.newtelligence.com/2004/10/MyBank”>262616161</my:Account>
<wsa:Action>http://schemas.newtelligence.com/2004/10/MyBank/Giro/Transfer</wsa:Action>
…
</soap:Header>
<soap:Body>
<my:Transfer
xmlns:my=”http://schemas.newtelligence.com/2004/10/MyBank”>
<my:TransferDestination>
<my:AccountNo>99999999999</my:AccountNo>
<my:Recipient>Peter Sample</my:Recipient>
<my:RoutingCode codeType=”DE-BLZ”>00000000</my:RoutingCode>
<my:Destination>Sample Bank</my:Destination>
</my:TransferDestination>
<my:Amount>100.78</my:Amount>
<my:Currency>EUR</my:Currency>
<my:TransferDate>2004-10-27</my:TransferDate>
<my:ValueDate>2004-10-27</my:ValueDate>
<my:Transfer>
</soap:Body>
</soap:Envelope>
[2]
<soap:Envelope xmlns:soap=”http://www.w3.org/2003/05/soap-envelope”
xmlns:wsa=”http://schemas.xmlsoap.org/ws/2004/08/addressing” >
<soap:Header>
<wsa:To>http://www.example.org/Giro/Transfer</wsa:To>
<wsa:Action>http://schemas.newtelligence.com/2004/10/MyBank/Giro/Transfer</wsa:Action>
…
</soap:Header>
<soap:Body>
<my:Transfer
xmlns:my=”http://schemas.newtelligence.com/2004/10/MyBank”>
<my:Account>262616161</my:Account>
<my:TransferDestination>
<my:AccountNo>99999999999</my:AccountNo>
<my:Recipient>Peter Sample</my:Recipient>
<my:RoutingCode codeType=”DE-BLZ”>00000000</my:RoutingCode>
<my:Destination>Sample Bank</my:Destination>
</my:TransferDestination>
<my:Amount>100.78</my:Amount>
<my:Currency>EUR</my:Currency>
<my:TransferDate>2004-10-27</my:TransferDate>
<my:ValueDate>2004-10-27</my:ValueDate>
<my:Transfer>
</soap:Body>
</soap:Envelope>
A possible endpoint reference (“object pointer” in OOldspeak) for the message target for [1] is
<wsa:EndpointReference
xmlns:wsa=”http://schemas.xmlsoap.org/ws/2004/08/addressing” >
<wsa:Address>http://www.example.org/Giro/Transfer</wsa:Address>
<wsa:ReferenceParameters>
<my:Account xmlns:my=”http://schemas.newtelligence.com/2004/10/MyBank”>262616161</my:Account>
<wsa:ReferenceParameters>
...
<wsa:EndpointReference>
A possible endpoint reference for [2] is
<wsa:EndpointReference
xmlns:wsa=”http://schemas.xmlsoap.org/ws/2004/08/addressing” >
<wsa:Address>http://www.example.org/Giro/Transfer</wsa:Address>
<wsa:EndpointReference>
I am sure it’s boring to everybody else, but I find it quite funny how WS-Addressing turns out to be the “Object Access Protocol” for SOAP ;-)