[web-devel] Re: Proposed changes to web-routes: query-string support
Jeremy Shaw
jeremy at n-heptane.com
Mon Aug 9 14:32:11 EDT 2010
Nice!
I have not had time to look at this in detail, and probably won't for
a few more days. But I am certainly in favor of the concept.
I recently wrote some code for one of my own projects to deal with
creating query string key/value pairs. It will be interesting to see
how they overlap.
- jeremy
p.s. Also, the query string is not required to be key/value pairs. It
can be any non-hierarchical data which, combined with the path info,
serves to identify a resource. It just happens the key/value pairs are
the single most common what of encoding the this data. If web-routes
is going to only support key/value pairs, that is fine. But we should
probably acknowledge that in the docs.
On Aug 8, 2010, at 7:03 AM, Michael Snoyman wrote:
> Hi Jeremy,
>
> I've CCed the web-devel list, as I think the discussion will be of
> interest to a number of readers there.
>
> When we were originally working on web-routes, you had mentioned the
> idea of including some form of support for query strings, and I said
> it was a bad idea. I'd like to backtrack on that statement: I
> *would* like to include support, and I'm including a patch that does
> just that. Let me explain the use case this is meant to serve, which
> will help explain my design decisions.
>
> Yesod includes a static file subsite. One trick a lot of sites are
> using these days is including a hash of the file contents in the
> query string of the URL and setting the expiration date of the file
> far in the future. This way, as long as the file contents stay the
> same, the browser should use the cached copy, and as soon as a new
> version is available, the HTML will reflect this by a change in the
> hash value.
>
> I wanted to provide this feature with Yesod, but realized there was
> no straight-forward way to do this. What I needed was to change the
> formatPathSegments function to have a type signature of: url ->
> ([String], [(String, String)]), where the second element in the
> tuple is the query-string parameters. This, however, presents a
> small problem: let's say that we want to add query string parameters
> *on top of* those provided by the formatPathSegments function; we
> could do manually addition textually, but we won't know whether to
> include is as "?foo=bar" or "&foo=bar"; the former should be used if
> formatPathSegments does not given any query string parameter, the
> latter if it does.
>
> I therefore modified the handleSite function to be: (url ->
> [(String, String)] -> String) -> url -> a. I also changed
> encodePathInfo to also encode the query string parameters, so its
> type is now: [String] -> [(String, String)] -> String. All the other
> changes were just to get the code to compile.
>
> I'm planning on this being a change throughout a few other
> libraries: web-routes-quasi will obviously change to reflect this,
> as will Yesod. One other perhaps unexpected change would be in
> Hamlet: the definition of Hamlet is now "type Hamlet = (url ->
> [(String, String)] -> String) -> Html ()". One nice side effect of
> this is query-string encoding code is now completely localized to
> web-routes, instead of copied throughout multiple packages. This at
> least implies to me that this is a good move.
>
> You'll notice that I have purposely *not* modified decodePathInfo
> and parsePathSegments; I still don't believe routing should be
> affected in any way by query string parameters.
>
> Look forward to hearing your thoughts on this,
> Michael
> <query-string-support_.dpatch>
More information about the web-devel
mailing list