- From: Lee Feigenbaum <lee@thefigtrees.net>
- Date: Fri, 24 Dec 2010 14:21:42 -0500
- To: SPARQL Working Group <public-rdf-dawg@w3.org>
The first topic we discussed on the protocol teleconference was the
content of an HTTP request for the SPARQL Update Protocol. The consensus
was as listed at
http://www.w3.org/2009/sparql/wiki/Protocol#What_do_you_send_for_a_SPARQL_update_request.3F
:
"""
PROPOSED: SPARQL Update requests can be POSTed as either
application/x-www-form-urlencoded or application/sparql-update, pending
discovery of how to do the latter in WSDL 2
"""
The first half is the analog to SPARQL query. In that case, you send an
HTTP request like
POST /foo/bar/sparql HTTP/1.1
...
Content-type: application/x-www-form-urlencoded
default-graph-uri=...&named-graph-uri=...&named-graph-uri=...&update=<URL encoded
update request string>
There was a significant feeling that we'd like to also encourage direct
POSTing of SPARQL Update strings:
POST /foo/bar/sparql HTTP/1.1
...
Content-type: application/sparql-update
<unencoded content of SPARQL Update string goes here>
We also observed that this 2nd form doesn't give anyway to specify the
equivalent of the default-graph-uri and named-graph-uri parameters, so
it was suggested that perhaps those could be encoded in the URI query
string:
POST /foo/bar/sparql?default-graph-uri=...&named-graph-uri=... HTTP/1.1
...
Content-type: application/sparql-update
<unencoded content of SPARQL Update string goes here>
The SPARQL Protocol is currently normatively defined using WSDL 2.0. As
no one on the group is a WSDL expert, I took ACTION-341
(http://www.w3.org/2009/sparql/track/actions/341) to investigate whether
we could specify the above behavior(s) in WSDL.
From what I've read, I do _not_ believe that this is a setup that can
be specified using the HTTP bindings for WSDL 2.0.
The obvious idea was to specify
whttp:inputSerialization="application/sparql-update" in the WSDL, where
currently we would do something like
whttp:inputSerialization="application/x-www-form-urlencoded" .
From
http://www.w3.org/TR/wsdl20-adjuncts/#_http_binding_default_rule_psf, I
learn that we first need to consider the message content model that is
used to define the (abstract) interface message. From
http://www.w3.org/TR/2007/REC-wsdl20-20070626/#InterfaceMessageReference_element_attribute
I learn that the message content model is specified by the value of the
"element" attribute on the <input> element of the interface operation.
From the SPARQL 1.0 Protocol WSDL -
http://www.w3.org/2007/SPARQL/protocol-query.wsdl - I see that our WSDL
uses element="st:query-request" which means that it's using #element
message content model.
Going back to
http://www.w3.org/TR/wsdl20-adjuncts/#_http_binding_default_rule_psf,
I'm pointed to the rules in 6.4.3.1 (directly below), which in turn say:
"""
* If the serialization format is
"application/x-www-form-urlencoded", then the serialization of the
instance data is defined by section 6.8.2 Serialization as
application/x-www-form-urlencoded .
* If the serialization format is "multipart/form-data", then the
serialization of the instance data is defined by section 6.8.4
Serialization as multipart/form-data .
* If the serialization format is "application/xml", then the
serialization of the instance data is defined by section 6.8.3
Serialization as application/xml .
* Otherwise, then the serialization of the instance data is defined
by section 6.8.3 Serialization as application/xml with the following
additional rule: the value of the HTTP Content-Type entity-header field
is the value of the serialization format and its associated media type
parameters, if any.
"""
There's no leeway here for serialization of the element content in
anyway other than XML, multipart form data, or a query string.
OK, so the next question is whether we could change the WSDL to use a
message content model other than #element. Looking back up at 6.4.3,
#any has the same rules as #element, and #none requires empty content.
So what about #other?
"""
If the value is "#other", then the serialization format and its
associated media type parameters, if any, specifies the value of the
HTTP Content-Type entity-header field as defined in section 14.17 of
[IETF RFC 2616]. The serialization of the payload is undefined.
"""
So basically, for #other, all that the WSDL does is tell you what the
Content-type of the request should be, and all other details are left
unspecified. So we could legally use that with
whttp:inputSerialization="application/sparql-update", which basically
specifies practically nothing. If we were to go that route, then
combined with the fact that we've already decided to remove the explicit
SOAP section from the document, I think we'd be better off losing the
WSDL definition entirely.
Given this, the 2nd half of the question becomes less critical, but it
had an easier answer. From
http://www.w3.org/TR/wsdl20-adjuncts/#_http_serialization, I see that
there's (in general) no problem encoding some of the parameters of an
input message in the request URI and others in the message body.
But anyway, I see two main options given this, neither of which is
totally satisfying:
Option 1:
Rewrite the SPARQL protocol to be defined normatively without using WSDL
2.0.
Pros: We can specify the exact behavior that we want. The protocols
are simple enough that this is not overly complex.
Cons: This is a large editing job, and we already have scheduling and
resource issues with getting protocol to Last Call. Also, I'm sure there
are many specification details of "the right way to use HTTP" that are
taken care of us automatically by leaning on WSDL that we might have to
be explicit about in this case.
Option 2:
Only support the application/x-www-form-urlencoded scenario in the
SPARQL 1.1 Protocol. SPARQL Update request strings can be used directly
as per the informative text in the Uniform HTTP Protocol -
http://www.w3.org/2009/sparql/docs/http-rdf-update/#http-patch .
However, this use is limited to modifying a single graph that is
identified by the request.
Pros: Easiest path forward.
Cons: Does not give a well-defined, interoperable way to directly
POST SPARQL Update request strings.
thoughts?
Lee
Received on Friday, 24 December 2010 19:22:32 UTC