amon2にはプラグインとして、 JSON.pm というJSON出力用のプラグインがある。
http://search.cpan.org/dist/Amon2/lib/Amon2/Plugin/Web/JSON.pm
このプラグインを利用すればJSONは出力できるんだけど、
HTTPのステータスコードを変更できない。
ということで、
JSON.pm をHTTPステータスコードを渡せるように修正し、
lib内のプラグインとして扱う。
まずは JSON.pm を /lib/ProjectName/Web/Plugin にコピーして AppJson.pm にリネームする。
パッケージ名のリネームも忘れないように。
そして、Web.pm でAppJson.pmを読み込む。
lib内のプラグインはlocal内のプラグインと指定方法が違うので注意。
# load plugins __PACKAGE__->load_plugins( 'Web::FillInFormLite', '+ProjectName::Web::Plugin::AppJson', # ここで指定する。 );
これでファイルの設置は完了。
あとはステータスコードを渡せるように AppJson.pm を修正する。
まずは引数受け取りの部分で
$state がステータスコードで引数で指定されなければ 200 を返すように修正する。
my ($c, $stuff, $status) = @_; # 引数を追加 $status = 200 unless defined $status; # デフォルト値として 200 を指定
あとはステータスコード200がハードコーディングされている以下を$status参照にするだけ。
*JSONハイジャックのバリデーションで 403 を指定してある箇所はそのままにしておく。
*HTTPヘッダーとかも好きなように変えてしまえばいい。
my $res = $c->create_response($status); # $statusを参照するように修正
クライアントコードは以下。
$c->render_json(+{message => 'success'}); # ステータスコードを指定していないので、200が返る。 $c->render_json(+{message => 'error'}, 403); # ステータスコードを指定しているので、403が返る。
perl の rest ってググっても情報ないんだけど、みんなどーやってんだろ。
PHPとかrubyだとフレームワークにそれ用の機能があったり、
定番ライブラリがあったりすると思うんだけどな・・・。