- From: James Manger <James@Manger.com.au>
- Date: Thu, 12 Nov 2009 01:06:21 +1100
- To: uri@w3.org
- Message-Id: <7345C930-DFA2-42BF-B37C-595A85C61DF9@Manger.com.au>
I expect one of the most common use cases for URI templates will be building query parameters using variable names defined by some specification. For instance, OpenSearch defines variables such as 'searchTerms', 'count', 'startPage', 'language', 'inputEncoding'. Many web sites will want to use different query parameter names to carry the values of these variables. For instance, 'q' for 'searchTerms', 'page' for 'startPage', 'lang' for 'language' etc. This cannot be done well with the current working draft. The working draft says [in 2.5 Variables]: "The variable names serve multiple purposes: documentation for what kinds of values are expected, identifiers for associating values within a URI Template processor, and the string to use for each key on key=value substitutions." I disagree with this restriction. A URI template should allow the template author to choose "the string to use for each key", independently of what another party has decided for the variable name (for documentation and as an identifier). Of course a template author can write "?q={searchTerms}&p= {startPage}". However, the URI Template spec has a '?' operator to do better than this -- allowing the whole "&p=" part to be omitted when no 'startPage' is defined, for instance. I suggest changing the '?' operator to have a form like "{?name=[var]}". If 'var' is omitted (the template is "{?name=}") then (as with the current draft) 'name' is used as both the variable name and the query parameter name. '=' is currently used to introduce a default value: {[op]var [=default]}. However, you don't need to use an operator and a default together. For instance, in the current syntax "{?startPage=1}" can be written as "?startPage={startPage=1} -- there is always a value (from the variable or the default) so the operator-related parts will always be present so they can be 'literals' outside the { } brackets. Please also require a template processor to be smart about a '?' operator: substituting '?...' if it is the first query param (no previous '?' in the URI being built), or substituting '&...' otherwise. If this {?name=[var]} proposal is accepted it might be worth making some other changes to keep the syntax consistent. Below is one idea: {[op [name=]] [vartype] varname [modifier] [| default]} * add a ',' operator, instead of supporting a variable-list in each {...} expression * 'default' is a default for the whole expression, not just the variable value excluding modifiers * use 'name' as the variable name if 'varname' is an empty string James Manger
Received on Wednesday, 11 November 2009 14:06:59 UTC