- From: Philippe Le Hegaret <plh@w3.org>
- Date: Thu, 18 Dec 2003 10:56:28 -0500
- To: Web Services Description <www-ws-desc@w3.org>
Here is a revised proposal for the HTTP binding. It includes the general URI replacement with an example. It also includes content duplication if HTTP POST and General URI replacement mechanism are in use (as discussed last week). [[ 1 HTTP binding for input message reference components referencing XML Schema types If two operations happen to have the same input, only one is allowed to be bound to GET. [[need better wording to express this constraint in terms of components. This constraint should probably be applied from the endpoint component level]] All element names and content MUST be URI escaped when inserted in the URI. 1.1 General URI replacement mechanism The URI replacement mechanism can be applied to the HTTP binding, independently of the HTTP method in use. The replacement property contains a relative URI, without a query part and this URI is relative to the "service endpoint". In order to apply the URI replacement mechanism, the Interface Operation component MUST follow the rules of one of the following operation styles: RPC style, Set-Attribute Style (only if the HTTP verb in use is POST or PUT), or Get-Attribute Style. The URI may also contain one or more patterns for each element of the sequence defined by the content model. Each pattern MUST reference one element using its qualified name and an element MUST NOT be referenced more than once using the URI replacement pattern. Each element MUST have an XML Schema type that is derived from xsd:anySimpleType with the exception of the types xsd:hexBinary, xsd:base64Binary, and a list simple type. Note that elements referenced using the URI replacement patterns are NOT removed from the set of elements when using the HTTP POST and PUT bindings. Elements referenced using the URI replacement patterns are removed from the set of elements when using the HTTP GET and DELETE bindings. Example: Given the XML schema definition and operation component: <xs:element name="InputCarData"> <xs:complexType> <xs:sequence"> <xs:element name="license" type="xsd:NCName"/> <xs:element name="property" type="xsd:NMTOKEN"/> </xs:sequence"> </xs:complexType> </xs:element> <interface name='Cars'> <operation name="getProperty_Input"> <input message='my:InputCarData' /> <input message='my:OutputCarData' /> </operation> </interface> with the following instance message component: <my:InputCarData> <my:license>AAA555</my:license> <property>color</property> </my:InputCarData> The URL of the endpoint is http://motorvehicles.example.com/cars The binding location of the interface operation component is location='/{my:license}/{my:property}' Using the URI replacement mechanism, a new relative URI is computed and the license and property parts are inserted into the URL http://motorvehicles.example.com/cars/AAA555/color 1.2 HTTP GET binding The HTTP GET binding SHOULD be used for operations that retrieve a representation of a resource identified by a URL. As defined by the RFC 2616 (Section 9), the operation MUST be safe and idempotent. Input parameters SHOULD be used to filter the content of the representation, for example to performs searches or queries. Operations that do not satisfy these requirements SHOULD use the POST binding (or other application HTTP verbs when bindings for them are specified). Once the general URI replacement has been applied, the remaning elements are encoded as query parameters in the URI of the HTTP GET request. The body of the HTTP GET request is empty. In order to apply the URI replacement mechanism, the Interface Operation component MUST follow the rules of one of the following operation styles: RPC style or Get-Attribute Style. The local names of the remaining elements MUST be unique, independently of their associated namespaces. 1.2.1 No remaining elements In such case, no query parameters are required to be sent to the resource. The URL used for the HTTP GET request is equivalent to the one composed from section 1.1. Example: URL used for the HTTP GET request: http://motorvehicles.example.com/cars/AAA555/color 1.2.2 One or more remaining elements Each remaining element MUST have an XML Schema type that is derived from xsd:anySimpleType with the exception of the types xsd:hexBinary and xsd:base64Binary. This HTTP GET binding is NOT applicable if one of the elements references the following XML Schema types: - an XML Schema complex type definition - the XML Schema types xsd:hexBinary and xsd:base64Binary, a type derived from xsd:hexBinary or xsd:base64Binary. Each element binds to one or more pairs of [name, value]. Pairs are inserted in the query part of the URL. The [local name] property of the element information item represents the name in the pair. Unless the XML Schema type is a list simple type definition, the element binds to exactly one pair of [name, value] and the value associated with the name is the content of the instance input message. Example: <xs:element name="InputCarData"> <xs:complexType> <xs:sequence"> <xs:element name="license" type="xsd:NCName"/> <xs:element name="property" type="xsd:NMTOKEN"/> </xs:sequence"> </xs:complexType> </xs:element> <interface name='Cars'> <operation name="getProperty_Input"> <input message='my:InputCarData' /> <input message='my:OutputCarData' /> </operation> </interface> with the following instance message component: <my:InputCarData> <my:license>AAA555</my:license> <property>color</property> </my:InputCarData> The URI of the endpoint is http://motorvehicles.example.com/cars/ The binding location of the interface operation component is location='{my:license}' Using the URI replacement mechanism, the license is inserted into the URI http://motorvehicles.example.com/cars/AAA555 Using the URL encoding mechanism, the my:property element is added in the query part: http://motorvehicles.example.com/AAA555?property=color If the element has an XML Schema list simple type definition, each item in the content of the instance element binds to a pair, and the values are the items themselves (the name remains the same for all pairs). Note that if the list is empty, no pair will be created. Example: <xs:element name="InputCarData"> <xs:complexType> <xs:sequence"> <xs:element name="license" type="xsd:NCName"/> <xs:element name="properties" type="xsd:NMTOKENS"/> </xs:sequence"> </xs:complexType> </xs:element> <interface name='Cars'> <operation name="getProperty_Input"> <input message='my:InputCarData' /> <input message='my:OutputCarData' /> </operation> </interface> with the following instance message component: <my:InputCarData> <my:license>AAA555</my:license> <properties>color year engine_number</properties> </my:InputCarData> The URI of the endpoint is http://motorvehicles.example.com/cars/ The binding location of the interface operation component is location='{my:license}' Using the URI replacement mechanism, the license is inserted into the URI http://motorvehicles.example.com/cars/AAA555 Using the URI encoding mechanism, the properties are added in the query part: http://motorvehicles.example.com/AAA555?properties=color&properties=year&properties=engine_number 1.3 HTTP POST binding The HTTP POST binding SHOULD be used for operations that MAY have side effect on the resource identified by a URI. The operation is NOT guaranteed to be safe and idempotent, as suggested by the RFC 2616. The elements of the input are encoded in the body of the HTTP POST request. Note that all elements that have been included in the URI using the general URI replacement mechanism are included as well in the body of the HTTP POST request. 1.3.1 Using the XML encoding mechanism The HTTP header Content-Type must be the media type application/xml or any derived XML type (*/*+xml). The element referenced from the input component of the interface operation component is the content of the body of the HTTP POST request. Example: @@TODO 1.3.2 Using the multipart encoding mechanism Each element of the sequence inside the element referenced from the input component of the interface operation component is encoded as a separate multipart part. In order to apply this mechanism, the Interface Operation component MUST follow the rules of one of the following operation styles: RPC style, or Set-Attribute Style. For each element in the sequence: - If the element has a simple type definition xsd:hexBinary or xsd:base64Binary or a derived type from xsd:hexBinary or xsd:base64Binary, the content of the element instance is the content and the media type is the one specified (@@cf Media types work). - Otherwise, the XML representation of the element instance is the content and the media type is application/xml or any derived XML type (*/*+xml). Example: @@TODO 1.3.3 Using the application/x-www-form-urlencoded encoding mechanism Each element of the sequence referenced from the interface operation MUST have an XML Schema type that is derived from xsd:anySimpleType with the exception of the types xsd:hexBinary and xsd:base64Binary. This mechanism is NOT applicable if one of the types referenced from the message parts reference: - an XML Schema complex type definition - the XML Schema types xsd:hexBinary and xsd:base64Binary, a type derived from xsd:hexBinary or xsd:base64Binary. [[@@ describe the encoding mechanism or provide a reference to the right place]] Example: @@TODO 1.4 HTTP PUT binding @@TODO @@restriction on the output message? 1.5 HTTP DELETE binding @@TODO @@restriction on the output message? 2 HTTP binding for output message reference components referencing XML Schema types The content of the output message is encoded in the content of the HTTP reply. [ditto HTTP POST binding for input message, minus the URI mechanisms] ]] Philippe
Received on Thursday, 18 December 2003 10:56:41 UTC