Erlang製のWebフレームワークMochiWebをさらっと触ってみたでござるの巻(その3)

今回は前回作ったモジュールにちょっと手を入れてパラメータをとれるようにしてみます。

過去記事はこちら
Erlang製のWebフレームワークMochiWebをさらっと触ってみたでござるの巻
Erlang製のWebフレームワークMochiWebをさらっと触ってみたでござるの巻(その2)

たとえば次のようなURLリクエストをうけた場合に
http://localhost:9999/user/wolcome?name=shin

"name"というキーの値として"shin"を受け取れるようになると表現の幅が広がります。

さらにRailsなどでは
http://localhost:9999/user/wolcome/shin
のようなリクエストに対して三つ目のパス(この場合は"shin")をあらかじめルートを定義しておけば取得出来ますので、これもやってみます。

ソースは以下のようにしました。

-module(user_action).

-export([start/1, stop/0]).

start(Port) ->
    mochiweb_http:start([{port, Port}, {loop, fun dispatch/1}]).

stop()->
    mochiweb_http:stop().

%%%===================================================================
%%% Reqest Dispatcher
%%%===================================================================

dispatch(Req) ->
    Path = Req:get(path),
    Params = Req:parse_qs(),

    case string:tokens(Path, "/") of
        [Controller, Action | UrlParams] ->
            handle(Controller, Action, UrlParams, Params, Req);
        [Controller] ->
            handle(Controller, "index", [], Params, Req);
        [] ->
            handle("top", "index", [], [], Req)
    end.

%%%===================================================================
%%% Request Handlers
%%%===================================================================

handle("top", "index", _Path, _Params, Req) ->
    Req:ok({"text/html", "Welcome!"});

%%===================================================================
%% @doc
%% URLの一部としてnameを取得
%% example: http://localhost:9999/user/wolcome/shin
%%===================================================================
handle("user", "welcome", [Name], _Params, Req) ->
    Req:ok({"text/html", subst("Welcom(in url) ~s!", [Name])});

%%===================================================================
%% @doc
%% getパラメータとしてnameを取得
%% example: http://localhost:9999/user/wolcome?name=shin
%%===================================================================
handle("user", "welcome", [], Params, Req) ->
    Name = proplists:get_value("name", Params),
    Req:ok({"text/html", subst("Welcom(from get) ~s!", [Name])});

handle(_, _, _, _, Req) ->
    Req:not_found().

%%%===================================================================
%%% Internal Functions
%%%===================================================================

subst(Template, Values) ->
    list_to_binary(lists:flatten(io_lib:fwrite(Template, Values))).

今までと同じようにノードを起動してコンパイルします。mochiwebへのパスを追加するのを忘れずに...

$ erl -pa ../mochiweb/ebin
1>c(user_action).
{ok,user_action}

2> user_action:start(9999).
{ok,<0.38.0>}

ブラウザを開いてアクセスしてみます。
http://localhost:9999/user/welcome?name=shin

さらに
http://localhost:9999/user/welcome/shin

どうやらおkなようです。
大事な部分としては

Req:parse_qs().

でパラメータが得られる事。そこから

proplists:get_value("name", Params).

で目的のキーに対する値が得られる部分です。