XMLHTTPRequest

2017/12/03

昨日は初めて、Ajax――XMLHTTPRequestを使ってみました。
ひさびさにOperaを使ってみると、やはり早いんですよね、Firefoxも拡張やカスタマイズ次第では肩を並べるレベルになるとは思いますが、スクロールバーを動かしたときなどCPU使用率が100%になる問題や、メモリの使用量などの側面では、勝てないでしょうね。
しかし、Operaにするためにはせめて、はてなバーくらい使えないと。代替のものを作成しなければいけません。
――というわけで、CGIを使った独自のページを作ろうか ということになったのです。その辺のマイページサービス(Googleパーソナライズトップや、Windows Liveなど)を使えればいいんですが、サイドバーのような省スペースでの表示を想定してるものは、ありませんね。

そこで動作の中にAjaxを盛り込むことにしました。
これはちまたにかかれているとおり

req = new XMLHttpRequest();
req.open(POST, URL, 同期して動作するか、非同期で動作するか);
req.setRequestHeader(Content-Type, application/x-www-form-urlencoded);
req.send(POSTで送る文字列(GETと同じように&か;で区切る));

というのが基本形です。送信メソッドがGETであった場合もたぶん同じ。受ける側は、いつもCGIでやってるのと同じように

$CGI = new CGI;
$param = $CGI->param(取得したいフィールド);

などと言うようにすればよい。
req.openの第三引数をfalseにすれば同期モードで動作するので、動作完了とともに何か表示するとかいったことも簡単にできます。
もちろん、POSTでも、query_stringをくっつける(req.open(..., index.cgi?param, ...)みたいに)することもできます。その辺はふつうにリクエストを受けたときと同じ。
ついでに、XMLHTTPRequestで受けた接続には、何も返さなくても問題ありません。CGIをまるでAPIでも呼ぶかのような感覚で使えますね。
今回はまあ、実用には達していませんが、何とか実用レベルまで持って行きたいです。

ついでに、CGI.pm

use CGI;
use constant CGI => new CGI();
CGI->params...

当たり前ではありますが、このように定数としても使えます。
どうせインスタンスは一個しか作らないんだし、こういうのはスカラ変数にはしない。ちょっと見栄え良くなるかなぁ と思ったり。