- From: youenn fablet <youenn.fablet@crf.canon.fr>
- Date: Wed, 16 Feb 2005 09:51:07 +0100
- To: www-ws-desc@w3.org
As I said at last F2F, I am not a huge fan of splitting application data at the interface level in two sets (body and header). I do not remember any clear expressed semantic difference between the two sets. IIRC, on reason for that proposal was to enable versioning (is there any other usecase ?) One proposed solution to versioning was to build a wrapper element around a well-known type to add some more data. The other proposed solution was the use of the ADD feature. The assumptions I am making is that it would be better to: - keep the simple "one bag of application data" design at the interface level - have the same interface description no matter what versioning solution is used. Here is an iteration on the ADD idea that may fullfill these assumptions: 1) At the abstract layer, always define a wrapper element. This wrapper element has restrictions in its definition (this may be a new type style that allows only one sequence with global element referenced inside the sequence), something like: <element name="tns:myNewTravelRequest"> <complexType> <sequence> <element ref="tns:myTravelRequest"/> <element ref="tns:isGoldCardMember" minOcurrs="0"/> <!-- a new data item --> ... </sequence> </complexType> </element> 2) Refer to this wrapper element within an abstract operation description 3) Declare whether to use the ADD module at the binding level 4) Set somewhere in the WSDL description between the wrapper element declaration and the binding declaration, a property that will set which pieces of the wrapper element go into the body section and which pieces go into the header section. A shortcut syntax can be provided to set this property, for instance within the wrapper element description. Here is an example of such a description: /***************************/ ... <element name="tns:myNewTravelRequest" *add:body*="tns:myTravelRequest"> <!-- *The add:body attribute directly sets the property *that tells what goes into the body in the refering operation property bucket--> <complexType> <sequence> <element ref="tns:myTravelRequest"/> <!-- the base type --> <element ref="tns:isGoldCardMember"/> <!-- a new data item --> ... </sequence> </complexType> </element> .. <interface> <operation ...> <input element="tns:*myNewTravelRequest*">...</operation> </interface> <binding... > *<!-- a binding that uses the add module -->* <operation ...><input ...>*<wsoap:module uri="add module uri" required="true"/>*...</input> </operation> </binding> <binding... > *<!-- a binding that uses the wrapper element alternative -->* <!-- no ADD module declaration--> </binding> /***************************/ The nice point of this example is that we keep the simple interface description system with only one bag of data per abstract message. It also enables keeping the same interface description with both versioning approaches. The decision to split data into two sections (or to keep it as it is) is let to the binding level which seems sensible to me. Also, any new WSDL binding specification will not need to support some sort of ADD module in order to serve existing interfaces already implemented by ADD-enabled services. For instance, we may not need to define an "ADD module" for the HTTP binding. This approach has also its drawbacks: It is going away from the simple rule: put this unbreakable @element application data into the body. It is also more difficult to test the unique GED best practice on an ADD-enabled service. Comments? Youenn
Received on Wednesday, 16 February 2005 08:51:59 UTC