[erlang-questions] Pattern-matching function?
anders conbere
aconbere@REDACTED
Thu Oct 30 21:16:40 CET 2008
On Thu, Oct 30, 2008 at 12:28 PM, Steve Vinoski <vinoski@REDACTED> wrote:
> On 10/30/08, anders conbere <aconbere@REDACTED> wrote:
>> To illuminate a bit, I'm writing a mochiweb app and hating life
>> because I haven't found a good way to reduce the amount of noise
>> created by the gargantuan case statement created by splitting up the
>> url.
>
> I don't use mochiweb so I can't comment on that, but with yaws I use
> separate functions to handle each URI as described here:
>
> <http://www.infoq.com/articles/vinoski-erlang-rest>
>
> In my experience breaking the handlers into different functions makes
> them more convenient to deal with. I'd be very surprised if you
> couldn't do something similar with mochiweb.
>
> (An aside: Joe Armstrong and I were wondering back at Erlang eXchange
> in July: maybe this is a dumb question but how do you actually
> pronounce "mochiweb" -- is it "mo-chee-web" or "mo-key-web" or
> "mock-key-web" or ...?)
>
>> When writing web applications like this in python, there are
>> often some nice tools provided to at least make the matching list of
>> routes more readable (see, routes, django urls, werkzeug etc.). Many
>> of these actually use regexes or a matching techniques that I could
>> also use in erlang, it just feels like a shame that matches aren't
>> more readily available as first class citizens.
>
> If you own the URIs, then you can make them as friendly as you want
> for the function arg matching approach described above. Some people
> downplay the design of URIs as being relatively unimportant, and from
> a client POV they're correct because a RESTful server is responsible
> for supplying the client with URIs embedded within hypermedia
> responses to drive the client through its application state, which
> means the client doesn't really need to care about the "shape" of the
> URIs. But from a server perspective, I disagree that URI design is
> unimportant -- if you design your URIs well, it definitely eases the
> difficulties of tying them to their underlying resource
> implementations.
>
> If you don't own the URIs, then matching can be a lot more problematic
> if the URIs are poorly designed. For example if they all use the same
> path and rely on query strings with lots of parameters for
> differentiation, then you're best off isolating their parsing into a
> function that effectively rewrites the URIs into something more
> friendly, and then dispatching them on that basis.
>
> I personally haven't seen any cases where I needed regexp URI matching
> for my RESTful web service implementations, but I acknowledge your
> mileage may vary.
Oh absolutely. The pattern isn't bad at all I do something very
similar in mochiweb (MOE-CHEE-WEB)
loop(Req) ->
Resp = case string:tokens(Req:get(path), "/") of
[] -> % GET
roto_web_views:version(Req);
["version"] -> % GET
roto_web_views:version(Req);
["register"] -> % POST
roto_web_views:register(Req);
["nodes"] -> % GET
roto_web_views:get_nodes(Req);
["nodes", NodeName] -> % GET DELETE
roto_web_views:nodes(Req, NodeName);
["nodes", NodeName, "queues"] -> % GET POST
roto_web_views:queues(Req, NodeName);
["nodes", NodeName, "messages"] -> % GET POST
roto_web_views:messages(Req, NodeName);
_ ->
{404, [], "{'error': 404, 'msg': \"Path not found\""}
end,
Req:respond(Resp),
ok.
That being said I would love to be able to do
URLS = [{module, roto_web_view}
{[], version},
{["version"], version},
{["register"], register},
{["nodes"], get_nodes},
{["nodes", NodeName], nodes};
{["nodes", NodeName, "queues"], queues};
{["nodes", NodeName, "messages"], messages};
],
where each function get's passed the Request and any matches in the
order they were specified.
~ Anders
>
> --steve
>
More information about the erlang-questions
mailing list