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).
で目的のキーに対する値が得られる部分です。