Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

Catalystで知ったこと

PerlフレームワークCatalyst完全入門

PerlフレームワークCatalyst完全入門


買って読み始めたので、知ったことメモ。

フォームデータの取得

今まで。

my $id = $c->req->param('id');

ただしこれだと、

しかし、paramメソッドはクエリ情報→ポストデータの順で値の取得を試みます。このため、クエリ情報/ポストデータの間で同名のパラメータがあった場合、意図しないデータを取得してしまう恐れがあるのです。
(P76)

なるほど。
これを避けるために、とても丁寧に記述するなら、こう。

# POST データ
my $id = $c->req->body_params->{'id'};

# GET データ
my $id = $c->req->query_params->{'id'};

名前なしのクエリ情報

これはCatalystとは直接関係ないか。
GETでURLにクエリを追加する場合、値がひとつだけなら、key に相当する部分を省略できるらしい。

http://mysearching/search?Perl

受け取り方。

my $search_word = $c->req->query_keywords;
#=> Perl

ほお。

リクエストヘッダの全取得

リクエストヘッダは個別にはこう取れる。

my $user_agent = $c->req->header('User-Agent');

一気にオブジェクトとして取得するには、以下。

my $headers = $c->req->headers;

返却値は、HTTP::Headersオブジェクト。

my $user_agent = $headers->header('User-Agent');

TTでHTML以外

Template Toolkitで以下のようなテンプレートを作る。

[%- FOREACH item = list -%]
[% item.isbn %],[% item.title %],[% item.price %]
[%- END -%]

呼び出す方は、

# レスポンスヘッダに設定
$c->res->header(
  'Content-Type' => 'application/octet-stream',
  'Content-Disposition' => 'attachment; filename = "myfile.csv"',
);
# 置換データ
$c->stash->{list} = [@data];

この状態でアクセスがあると、普段のHTMLではなくて、CSVの保存確認ダイアログが開かれる。
Content-Type が octet-stream だからなんだろうな。
TT自体はそのことは全く関係しないってことか。