URI template: explode modifiers {var*}

Thanks for the latest URI template draft (draft-gregorio-uritemplate-04), Roy.
The prose is a pleasure to read, though I have some concerns with the
operators and modifiers.

The explode modifiers ("*" and "+"), defined in section 2.4.1 and 3.4,
are strange (and complicated) beasts.
The intention seems to be to make it easier to include a collection
of values in a URI, by grouping them together under a single variable name.

This doesn't feel like a good approach to me.

Once a variable is defined as holding a collection there is no way
for a template author to select a particular component.

The draft uses 'address' as an example. /mapper{?address*} is expanded to
/mapper?city=Newport%20Beach&state=CA.

What if a particular site decided to host each state's maps using a
per-state domain name (eg http://ca.example.com/mapper?city=...).
This cannot be done once clients are grouping all the address fields under
one variable.
Unfortunately, the decision to use a single 'address' variable may have
been made years earlier, or by another party, such as a standards body.

The explode modifiers provide a choice about how to package items when
defining variables (grouped or individual), but the choice drastically
affects the URI spaces that can be built.
This is bad news when different parties control the URI space
(the template author) and the variables (eg the OpenSearch spec).


Perhaps a different definition of an explode modifier would work:

Treat var* like a wildcard.
Make it shorthand for listing all defined variables with var as a prefix
of their name.
It could even be a bit smart and only select variables that are not selected
more specifically in any other expression in the template.

Example:
 from_zipcode := "1234"
 from_city := "Abc"
 to_zipcode := "9999"
 to_state= "CA"

/mapper{?from*,to*} expands to
/mapper(?from_zipcode=1234&from_city=Abc&to_zipcode=9999&to_state=CA

http://{to_state}.example.com/mapper{?from*,to*} expands to
http://ca.example.com/mapper?from_zipcode=1234&from_city=Abc&to_zipcode=9999


{?*} could be a convenient way of including all the rest of the variables as query params.


--
James Manger

Received on Monday, 5 April 2010 23:25:18 UTC