@nqounetです。

第7回では、フォームに値を残しておく方法を学びました。

ところで、HTTPにはGETメソッドとPOSTメソッドがありますが、投稿フォームにはPOSTメソッドのほうが向いています。

HTMLでは簡単な変更ですが、もちろんhelperを使っていても簡単に変更できます。

サンプルコード全体

Mojoliciousのバージョンは6.01で確認しています。

ファイル名はなんでも良いですが、ひとまずmyapp.plと考えてください。

myapp.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/env perl
use Mojolicious::Lite;

get '/' => sub {
my $c = shift;
$c->render(template => 'index');
};

post '/' => sub {
my $c = shift;
my $user = $c->param('user');
$c->stash(hello => qq{Hello $user!});
$c->render(template => 'index');
};

app->start;
__DATA__
@@ index.html.ep
<!DOCTYPE html>
<html>

<head>
<title>title</title>
</head>

<body>
%= form_for '/', method => 'post', begin
%= text_field 'user'
%= submit_button 'Submit!'
% end
<p><%= $hello %></p>
</body>

</html>

解説

Line 4 - 7

1
2
3
4
get '/' => sub {
my $c = shift;
$c->render(template => 'index');
};

getの部分がとてもシンプルになりました。

これまで、getでフォームを受け取っていましたが、その部分がなくなりました。

Line 9 - 14

1
2
3
4
5
6
post '/' => sub {
my $c = shift;
my $user = $c->param('user');
$c->stash(hello => qq{Hello $user!});
$c->render(template => 'index');
};

新たにpostが出てきました。

書いている内容で実質変更になっているのは、getがpostに変わっただけで、それ以外の部分は前回のgetと全く同じです。

このようにして、POSTメソッドで/にアクセスした時に実行されるコントローラーを書くことができます。

CGIの時代にPerlを書いたことがある方は、query_stringや標準入力といった言葉を聞いたことがあると思います。

しかし、Mojolicious(だけではなく、最近のフレームワーク)では、GETでもPOSTでも同じ書き方でパラメータから値を取得できます。

Line 27 - 30

1
2
3
4
%= form_for '/', method => 'post', begin
%= text_field 'user'
%= submit_button 'Submit!'
% end

helperのform_forを使ってPOSTメソッドに変更する場合は、method => ‘post’をbeginの前に追記するだけでOKです。

HTTPのPOSTメソッドは、GETメソッドよりも送信可能なデータ量が多くなります(GETでは2KBから4KB程度ですが、POSTはほぼ無制限です)が、URLにパラメータが含まれません。

例えば地図を検索して、その場所をメールやLINEで知らせたい、というような用途が考えられる場合はGETメソッドが良いでしょう。

多機能だけど必要なところだけ使えばOK

Mojoliciousでは、HTTPのメソッドを意識することなくパラメータを取得できますので、用途に応じてGETとPOSTを使い分ける事が重要です。

皆さんも美味しいところだけをうまく使ってサクッとウェブアプリを作ってみましょう。