StrableとBase64で通信する
本日、ぱどタウンで犬のサイトがオープンしたわけだが、その中の「ショップ&スポット情報」のページでちょっとした荒技をつかった。
そもそも「ショップ&スポット情報」のページは、「ぱどタウン
まち探検ナビ」の検索結果のヘッダーとフッターを入れ替えたページ。
データベースを覗いたりというのは多少面倒なのでLWPでページのHTML持ってきて、前後を入れ替えようと思ったり、XML-RPCとかカッコいい手段を使ってみるとか考えていたんだけど、ふと元のCGIを見ていて思いついたアイディアがApache::Session::Serialize::Base64でと同じStorableでシリアライズしてbase64でエンコードする方法。もちろん両方ともPerlだからできるんだけど。
元CGIは
#!/usr/bin/perl use strict; use CGI; use HTML::Template; my $q=CGI->new(); 〜いろいろ処理〜 $q->param('data',$data);などと表示するデータは全て$q->paramで 〜いろいろ処理〜 my $tmpl = HTML::Template->new( filename =>"shop_spot.tmpl.html", loop_context_vars=>1,die_on_bad_params=>0,associate=>$q ); print $q->header(); print $tmpl->output;
と、テンプレートへのデータ受け渡しは全てassociateオプションで行っている。
表示に必要なデータはCGIオブジェクトに集まっているというわけです。
なので、これを奪ってきて、同じようなテンプレートを書けば(コピーすれば)簡単に再現が可能と。
CGIの普通の出力の前に
use MIME::Base64; use Storable; if($q->param('mode') eq "raw"){ my $qfreeze=Storable::freeze($q); my $encodefreeze=encode_base64($qfreeze); print $q->header(-type=>'text/plain',-charset=>'EUC-JP',-expires=>'now',-pragma=>'no-cache',-cache_control=>'no-cache'); print $encodefreeze; exit(); }
と書いて、Storableでシリアライズしてbase64でエンコードしたテキストを出力する。
受け側は、簡単に書くと
use LWP::Simple; use MIME::Base64; use Storable; my $raw = get ここにURL; my $q; eval{ my $decoded = decode_base64($raw); $q = Storable::thaw($decoded); };
こんなもんでできる。
結構簡単でしかも確実な通信方法。でも、荒技。