読者です 読者をやめる 読者になる 読者になる

Amon2で REST APIのJSON出力

perl

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だとフレームワークにそれ用の機能があったり、
定番ライブラリがあったりすると思うんだけどな・・・。