tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

【Mojolicious】MojoliciousでのGET|POSTのリクエストパラメータを取得するメモ - ルーティングキャプチャとかMojo::Message::RequestとかMojo::Parameters

はじめに

Mojoliciousアプリでリクエストパラメータを取得するときのメモ。

初歩的な内容ですがMojoliciousコントローラ内で
GETやPOSTされてきたパラメータを取得する際はいくつか方法があります。

今回はよく使われる3つの方法を書いてみました。

アジェンダ

  1. ルーティングでキャプチャされたパラメータの取得
  2. Mojo::Message::Requestからのパラメータの取得
  3. Mojo::Parametersからのパラメータの取得

前提

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あたりは下記を参考にしてみてください

ルーティング

今回のルーティング(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/samplef:id:tweeeety:20160221101315p:plain

ソース

ルーティング的には
$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->reqMojo::Message::Requestオブジェクト)に
->paramsを指定してやることで今度はMojo::Parametersが取得できます。

ひとつひとつパラメータを取得するのではなくhash的に取得したい場合はこちらのほうが便利です。

POSTする画面

formからPOSTする想定で
http://127.0.0.1:3000/parametersで表示される画面にてformにこんな感じで入力した感じで話を進めます。
submit先はparameters/samplef:id:tweeeety:20160221101329p:plain

ソース
  • 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^)/