RESTfulな形でオンラインゲームサーバーを構築しようと考えていて、検索したら出てきたのがこの記事。
ErlangとYawsを使ったRESTfulなサービス@InfoQこれを読みながら「ほうほう、yawsにはout/1以外にもout/3なんていうつなぎ方があるのか。それなら勝ったも同然だな」と思ったのですが、記事にある関数宣言に従ったモジュールをyawsにくわせても、ちーっとも動かない。
で。しばらく考えて気がついた。
InfoQさんの記事は
「out/3を自分で作るとRESTfulが作りやすくなるぜ」という意味だったのです。。。。
というわけで、とりあえずout/3を書いてみました。ちょろっと書くだけでmod_rewriteでごりごりやるようなRESTfulな処理が動くのはすごい便利。Yawsはぜひ使いこなしたいですね。
-module(sample_for_restful).
-include("/opt/local/lib/yaws/include/yaws_api.hrl").
-compile(export_all).
%% dispacher for RESTful service
out(A) ->
{http_request, Req, _params, _unknown} = A#arg.req,
Uri = yaws_api:request_url(A),
Path = string:tokens(Uri#url.path, "/"),
out(A, Req, Path).
%% sample for "GET http://localhost:8001/project/x/entities/123456"
out(A, 'GET', ["project", Project, "entities", EntityId]) ->
{ehtml,
[{p,[],
box(io_lib:format("GET for ~p~n"
"EntityId = ~p~n",
[Project,
EntityId]))}]};
%% sample for "catch all" handler.
out(A, _Method, _Params) ->
{ehtml,
[{p,[],
box(io_lib:format("general handler: A#arg.appmoddata = ~p~n"
"A#arg.appmod_prepath = ~p~n"
"A#arg.querydata = ~p~n",
[A#arg.appmoddata,
A#arg.appmod_prepath,
A#arg.querydata]))}]}.
%% utitity function in original sample.
box(Str) ->
{'div',[{class,"box"}],
{pre,[],Str}}.
このときのyaws.confはこんな感じ
<server erlangtestserver>
port = 8001
listen = 0.0.0.0
docroot = /somewhere/public_html
appmods = </project, sample_for_restful>
</server>