はじめに
Mojoliciousアプリでリクエストパラメータを取得するときのメモ。
初歩的な内容ですがMojoliciousコントローラ内で
GETやPOSTされてきたパラメータを取得する際はいくつか方法があります。
今回はよく使われる3つの方法を書いてみました。
アジェンダ
前提
plenv x carton x mojoアプリで記事を進めます。
以下、今回説明に使用するアプリの構成やらです
生成したアプリ
$ carton exec mojo generate app RequestParamSample::web # githubのプロジェクト名を変更したかったので生成後に名前を変えてます $ mv request_param_sampleweb mojolicious-request-param-sample # ごにょごにょしたあとの構成 $ tree -L 3 mojolicious-request-param-sample ├── README.md ├── lib │ └── RequestParamSample │ ├── web │ └── web.pm ├── public │ ├── css │ │ └── common.css │ └── index.html ├── script │ └── request_param_sampleweb ├── t │ └── basic.t └── templates ├── layouts │ └── default.html.ep ├── message_request │ └── index.html.ep └── parameters └── index.html.ep # 起動&確認 $ carton exec morbo script/request_param_sampleweb Server available at http://127.0.0.1:3000
plenv carton x mojoあたりは下記を参考にしてみてください
- 【Mojolicious】mac x plenv x Mojolicious::Lite x morbo をサクっとためす
- 【Mojolicious】Mojoliciousアプリをgenerateして雛形生成するメモ - おまけでplenv x carton x plackup
ルーティング
今回のルーティング(lib/RequestParamSample/web.pm)はこんな感じの前提です
package RequestParamSample::web; use Mojo::Base 'Mojolicious'; # This method will run once at server start sub startup { my $self = shift; # Router my $r = $self->routes; # 1. ルーティングでキャプチャされたパラメータの取得 $r->get('/capture/:name/:age')->to('url_capture#index'); # 2. Mojo::Message::Requestからのパラメータの取得 $r->get('/request')->to('message_request#index'); $r->post('/request/sample')->to('message_request#sample'); # 3. Mojo::Parametersからのパラメータの取得 $r->get('/parameters')->to('parameters#index'); $r->post('/parameters/sample')->to('parameters#sample'); } 1;
実際のソース
今回のソースはgithubにあげてあります。
実際にみながらのほうがわかりやすいかもしれません。
https://github.com/tweeeety/mojolicious-request-param-sample
1. ルーティングでキャプチャされたパラメータの取得
mojoを使ってパラメータを受け取る一番単純な方法がこれです。
http://127.0.0.1:3000/capture/hoge/25
にアクセスした際のパラメータの取得ですね。
ルーティングにて$r->get('/capture/:name/:age')->to('url_capture#index');
と指定することでurlに含まれる任意の文字列をキャプチャして取得できます。
ソース
lib/RequestParamSample/web/Controller/UrlCapture.pm
package RequestParamSample::web::Controller::UrlCapture; use Mojo::Base 'Mojolicious::Controller'; sub index { my $self = shift; $self->render('text' => # urlはurl_forで取得できる "url : " . $self->url_for . "<br>" . # キャプチャされたパラメータは$self->paramで取得できる "name : " . $self->param('name') . "<br>" . # キャプチャされたパラメータは$self->stashでも取得できる "age : " . $self->stash('age') ); } 1;
出力結果
url : /capture/hoge/25 name : hoge age : 25
参考
詳しくはこのあたりが参考になります
2. Mojo::Message::Requestからのパラメータの取得
コントローラの$selfにはいろいろなオブジェクトが含まれていますが
コントローラ内で$self->req
とすることで Mojo::Message::Request
にアクセスできます。
POSTする画面
formからPOSTする想定で
http://127.0.0.1:3000/request
で表示される画面にてformにこんな感じで入力した、
というていで話を進めます。
submit先はrequest/sample
。
ソース
ルーティング的には
$r->post('/request/sample')->to('message_request#sample');
のソースですね。
lib/RequestParamSample/web/Controller/MessageRequest.pm
package RequestParamSample::web::Controller::MessageRequest; use Mojo::Base 'Mojolicious::Controller'; use Data::Dumper; sub index { my $self = shift; $self->render(msg => 'mojo message request sample'); } sub sample { my $self = shift; # $self->req->paramでget|postされたパラメータが取得できる my $name = $self->req->param("name"); my $age = $self->req->param("age"); my $tel = $self->req->param("tel"); # $self->paramは$self->req->paramのショートカットなのでこれでもok my $name2 = $self->param("name"); # 出力 $self->render('text' => 'name : ' . $name . "<br/>" . 'age : ' . $age . "<br/>" . 'tel : ' . $tel . "<br/>" . 'name2 : ' . $name2 . "<br/>" ); } 1;
出力
name : hoge age : 25 tel : 09011112222 name2 : hoge
参考
詳しくはこのあたりが参考になります
3. Mojo::Parametersからのパラメータの取得
さきほどの$self->req
(Mojo::Message::Requestオブジェクト)に
->params
を指定してやることで今度はMojo::Parameters
が取得できます。
ひとつひとつパラメータを取得するのではなくhash的に取得したい場合はこちらのほうが便利です。
POSTする画面
formからPOSTする想定で
http://127.0.0.1:3000/parameters
で表示される画面にてformにこんな感じで入力した感じで話を進めます。
submit先はparameters/sample
。
ソース
lib/RequestParamSample/web/Controller/Parameters.pm
package RequestParamSample::web::Controller::Parameters; use Mojo::Base 'Mojolicious::Controller'; use Data::Dumper; sub index { my $self = shift; $self->render(msg => 'mojo parameters sample'); } sub sample { my $self = shift; # $self->req->paramsでMojo::Parametersオブジェクトが取得できる my $params = $self->req->params; # $self->req->params->to_hashでMojo::Parametersが # パラメータをhash形式で返却してくれる my $params_hash = $self->req->params->to_hash; # 出力 $self->render('text' => '$params_hash : ' . Dumper $params_hash); } 1;
出力
$params_hash : $VAR1 = { 'tel' => '09011112222', 'name' => 'hoge', 'age' => '25' };
参考
詳しくはこのあたりが参考になります
まとめ
簡単にですがMojoliciousでのパラメータ取得をまとめてみました!
自分的には$self->req->params->to_hash;
が一番使いやすいです\(^o^)/