- From: Jonathan Marsh <jmarsh@microsoft.com>
- Date: Wed, 21 Jan 2004 12:19:32 -0800
- To: <ygoland@bea.com>, <www-ws-desc@w3.org>
After only a brief read it appears this would constitute a reversal in the direction we agreed to pursue at our November FTF, which is to replace explicit structural support for headers at the abstract level with a feature/property based mechanism. One of the main motivators was that static headers (those that can be usefully described in WSDL) are both rare and not very interesting. From http://lists.w3.org/Archives/Public/www-ws-desc/2003Nov/0062.html: Headers: RESOLVED: Remove @headers attribute. RESOLVED: Rename @body to @message. RESOLVED: Rename @detail to @message ACTION: Glen to write up rationale for removing headers (and?) proposal for a generic header-adding property/feature. ...which action is still open. I don't expect it to be completed by the FTF, but we can hope :-). > -----Original Message----- > From: www-ws-desc-request@w3.org [mailto:www-ws-desc-request@w3.org] On > Behalf Of Yaron Goland > Sent: Tuesday, January 20, 2004 4:26 PM > To: www-ws-desc@w3.org > Subject: Header/Body Style Proposal > > > Arguably the most common protocol design style for application protocols > is > what this letter will refer to as the headerBody style. Protocols such as > HTTP, SOAP, FTP, IMAP, ACAP, SMTP, etc. all use application messages that > contain a single body and multiple headers. > > Given the universal popularity of this design style this letter proposes > that WSDL 2.0 add direct support for this style to WSDL 2.0. > > The headerBody style will use the message attribute to identify the > message's body. A new XML element, for use as a child of > input/output/infault/outfault in interface definitions, will be used to > specify one or more headers. The XML element is defined as headerDef and > has > four attributes: > > * name - A NCNAME that uniquely identifies a header instance within a > specific input/output/infault/outfault within a specific operation within > a > specific interface. Name is optional and is only needed if a binding will > need to provide additional information about the header. > * header - The QNAME of a XML element schema definition that defines > the > contents of the header. > * max - An int which specifies the maximum number of times that header > instance can be repeated. Max is optional and its default value is 1. > * min - An int which specifies the minimum number of times that header > instance can be repeated. Min is optional and its default value is 1. > > max MUST be greater than or equal to min. > > The headerDef XML element can be used 0 or more times. > > For example: > > <definitions...> > <interface...> > <operation...> > <input message="My:body"> > <headerDef header="My:header"/> > <headerDef header="My:otherHeader" min="3" max="7"/> > <headerDef name="optheader" header="My:header" min="0"/> > </input> > </operation> > </interface> > </definitions> > > The headerBody style depends on the binding to define if the header > ordering > is meaningful. In the previous example the first and third headers are of > the same type. Allowing types to repeat is useful for bindings where the > order of headers is meaningful. > > The headerBody style will be useful with both of the bindings that WSDL > 2.0 > provides, SOAP and HTTP as both of these protocols are based on > header/body > style messages. If this style is adopted then we can remove the element > attribute from the wsoap:header XML element and replace it with a name > attribute that would point to the name of the associated header in the > interface definition. The mustUnderstand and role attribute would remain > the > same. > > The SOAP binding for the headerBody style would specify that when sending > a > message the header ordering SHOULD be maintained by the WSDL processor. > > In the case of receiving a message the WSDL processor MUST be able to > accept > SOAP headers in any arbitrary order and MUST be able to accept headers > that > were not defined in the SOAP message's WSDL interface/binding definition. > > SOAP headers MAY be implicitly rather than explicitly included in an > operation definition as a consequence of a WSDL function or a SOAP module. > In other words, rather than explicitly including a reliable messaging or > security header one can readily imagine such headers being added as a > consequence of a WSDL function/SOAP module that required reliability or > security of a certain type. > > However, in many cases support for a particular function or module may not > be widespread amongst WSDL processors (even if the application layer above > the WSDL processor is aware of and able to handle the header implied by > the > function/module) and so it may be necessary to include the SOAP header > definition explicitly, even if it is redundant to a particular > function/module, in order to allow for the widest syntactic compatibility. > > The following is an example of a WSDL operation and SOAP binding that uses > the headerBody style. > > <definitions xmlns:my="http://foo/bar"> > <types> > <xs:scheme targetName="http://foo/bar"> > <xs:element name="headerOrBody" type="xs:string">/ > </xs:scheme> > </types> > <interface name="sample" > styleDefault="http://www.w3.org/@@@@/@@/wsdl/style/headerBody"> > <operation name="sampleOp1" > pattern="http://www.w3.org/@@@@/@@/wsdl/in-only"> > <input message="my:headerOrBody"> > <headerDef name="sampleOp1Header" header="my:headerOrBody" > min="0"/> > </input> > </operation> > </interface> > <binding name="soapSimplebind"> > <wsoap:binding > protocol="http://www.w3.org/2003/05/soap/bindings/HTTP/"/> > <operation name="sampleOp1Binding"> > <input messageReference="sampleOp1"> > <header name="sampleOp1Header" mustUnderstand="True"/> > </input> > </operation> > </binding> > </definitions> > > To save space I used the same element for the header and the body. What's > interesting about this example is that while sampleOp1Header is optional > (min="0"), the binding specifies that mustUnderstand = "True". What this > means is that IF the header is used THEN the mustUnderstand attribute MUST > be put on the header and assigned the value true. > > Either of the following SOAP 1.2 messages would be legal using the > previous > definition and binding: > > <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" > xmlns:my="http://foo/bar"> > <env:Header> > <my:headerOrBody mustUnderstand="true">really?</my:headerOrBody> > </env:Header> > <env:Body> > <my:headerOrBody>Uh huh</my:headerOrBody> > </env:Body> > </env:Envelope> > > Or > > <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" > xmlns:my="http://foo/bar"> > <env:Body> > <my:headerOrBody>Ahhh</my:headerOrBody> > </env:Body> > </env:Envelope> > > The HTTP binding would work similarly to SOAP but I'm waiting until the > HTTP > POST/PUT proposal gets a bit firmer before I try to put in details. I > think > the most interesting issue with HTTP header support is how to translate > the > XML element name and body for the WSDL header into a HTTP header. One can > imagine a myriad of different encoding possibilities. A minimal encoding > would require the header body to be a string. But one could also imagine > an > encoding that either strips out elements or replaces elements with a > divider > character such as a ";". Perhaps we will need to support both and specify > which one to use on a header by header basis. > > Thanks, > > Yaron >
Received on Wednesday, 21 January 2004 15:19:44 UTC