mochiweb POST/GET 編

mochiweb を使って色々いじっているのですが、ドキュメントが無く、基本ソースを読むしかないのでメモがてらにまとめていきます。まとめ方はかなり適当です、ごめんなさい。

HTML がまったくわからないので JSON を使った API の例になるとおもいます。

対象

  • Git の基本を理解している
  • Erlang の基本を理解している
  • HTTP の基本を理解している
  • mochiweb を起動出来る
  • API が何か知っている

Twitter API から学ぶ

なじみの深い TwitterAPI を例に学んでいきます。

Twitter REST API の使い方

GET !
http://api.twitter.com/statuses/user_timeline.xml?id=joelcomm

GET で呼ばれる前提ですね、id=joelcomm は mochiweb では parse_qs/0 で取れます。実際に取ってみましょう。

基礎編のサーバコードに色々追加していきます。

-module(test_server).

-compile([export_all]).

%% デバッグツールとして使う
-include_lib("eunit/include/eunit.hrl").

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

stop() ->
  mochiweb_http:stop().

dispatcher_requests(Req) ->
  %% 何が入ってくるのか見てみる
  ?debugVal(Req:parse_qs()),
  Req:ok({"text/html", <<"<html><body>hello mochiweb</body></html>">>}).

curl "http://127.0.0.1:8888/statuses/user_timeline.xml?id=joelcomm" を実行してみると以下の通りになります。

% erl
Erlang R14B02 (erts-5.8.3) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:0] [kernel-poll:false]

Eshell V5.8.3  (abort with ^G)
1> c(test_server).
{ok,test_server}
2> test_server:start().
{ok,<0.41.0>}
3> ./test_server.erl:16: Req : parse_qs ( ) = [{"id","joelcomm"}]

ちゃんと parse_qs/0 に {"id", "joelcomm"} が入っています。これを取るのは proplists:get_value/2 がお薦めです。この辺りは次回にでも。

POST !

さて、次は POST を取得してみましょう。POST の取得は parse_post/0 を使います。でもここまでくると POST と GET を判定したくなりますよね。メソッドの取得は get(method) を使います。

http://api.twitter.com/statuses/update.json
-module(test_server).

-compile([export_all]).

-include_lib("eunit/include/eunit.hrl").

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

stop() ->
  mochiweb_http:stop().

dispatcher_requests(Req) ->
  case Req:get(method) of
    'GET' ->
      ?debugVal(Req:parse_qs());
    'POST' ->
      ?debugVal(Req:parse_post());
    _ ->
      ok
  end,
  Req:ok({"text/html", <<"<html><body>hello mochiweb</body></html>">>}).

curl を使って GET と POST を送ってみます。

GET

% curl "http://127.0.0.1:8888/statuses/user_timeline.xml?id=joelcomm"
<html><body>hello mochiweb</body></html>

POST

% curl -d status=mochiweb "http://127.0.0.1:8888/statuses/update.json"
<html><body>hello mochiweb</body></html>

サーバ側の表示

./test_server.erl:16: Req : parse_qs ( ) = [{"id","joelcomm"}]
./test_server.erl:18: Req : parse_post ( ) = [{"status","mochiweb"}]

ちゃんとパースされて送られてることが分かりますね。

とりあえずここまで。