MoonWolf (moonwolf@moonwolf.com)
2004 年 9 月 2 日
Ruby には cgi.rb という CGI ライブラリが添付されており、tDiary、Hiki、RWiki といった Web アプリケーションは cgi.rb を使って書かれています。しかし cgi.rb を使いづらいと思った人たちが現れ cgi.rb の代わりとなるライブラリがいくつか発表されました (NARF、Rweb 等)。その中から Nora という Web ライブラリを連載形式で紹介していきたいと思います。
Nora とは HTTP、CGI といったプロトコル、API の下位階層から HTML、アプリケーションフレームワークといった上位階層まで Web プログラミング全般をサポートするライブラリです。
各クラスは機能ごとに分離され、cgi.rb から使うこともできますし、静的ファイル生成などのバッチ処理にも使えます。
Ruby 標準の cgi.rb でも RAA の各種ライブラリを使えば Nora と同様のことができます。それでも Nora を使う利点とはなんでしょうか?
まず Nora を使って “Hello World!” を表示してみましょう。
2 行目の require ‘web’ で主要なクラスを全て読み込みます。
4 行目の Web::Interface::AUTO.new でインタフェースオブジェクトを生成しています。Web::Interface::AUTO は拡張子や環境変数から CGI/mod_ruby/FastCGI を自動的に判断してくれます。
6 〜 11 行の api.each {〜} が Web アプリケーションのメインループです。CGI では 1 回しか実行されませんが、FastCGI 等の常駐タイプの API に対応するため繰り返しループの形になっています。
7 行目でレスポンスオブジェクト (Web::Response) を生成しています。
8 行目ではコンテントタイプを ‘text/plain’ にセットしています。HTTP のレスポンスヘッダには ‘Content-Type:text/plain’ と出力されます。
9 行目で “Hello World!” をレスポンスに書き出しています。IO のように <<,write でレスポンスに出力することができます。
10 行目でインタフェースオブジェクトにリクエストとレスポンスを返しています。これによりクライアントのブラウザに “Hello World!” が表示されます。
フォームに入力した値や URL の ‘?’ 以降のクエリ値を取り出すには Web::Request#[] を使います。
cgi.rb ではクエリ値とフォーム値の区別はありませんが Nora では Web::Request#query と Web::Request#form で区別しています。区別する必要がない場合は Web::Request#[] でクエリ値、フォーム値のどちらか入っているほうの値が取得できます。
クエリまたはフォームの text フィールドで最初の値を取得するには req[“text”] または req[“text”,0] と記述します。値があれば String が戻り無い場合は nil が戻ります。
text フィールドの 2 番目の値を取得するには req[“text”,1] と記述します。
text フィールドの値を配列として取得するには req[“text”,nil] と記述します。
7 行目で “name” という名前のフィールドの値を取り出しています。”name” の値が無かった場合、req[“name”] で nil が戻り name 変数は “World” になります。
11 〜 24 行目で HTML をヒアドキュメントの形式で書き出しています。
Web::escapeHTML(name)は name の中の ‘<’,’>’,’&’,’”’ を文字実体参照に置換 (エスケープ) しています。ユーザの入力した値を表示するときは、このようにエスケープ処理をしないとクロスサイトスクリプティングというセキュリティ問題になるので注意が必要です。
今回紹介した内容では本格的なアプリケーションを組むには不十分だと思います。次回はより実践的なアプリケーションを組むための Web アプリケーションフレームワークとテンプレート機能について紹介いたします。
MoonWolf は半導体メーカに勤めるプログラマです。2000 年に Ruby に触れ、それ以降 RAA (Ruby Application Archive) にてライブラリ・アプリケーションを発表し続けています。登録プロジェクト数 26 と世界 2 位であり 1 位を目指して日夜拡張ライブラリの書けそうな C ライブラリを探しています。著者の連絡先は moonwolf@moonwolf.comです。