辞書サービスを考える
辞書サービスは、何らかのキーをパラメータにサーバに要求を行うと、キーに関連付けられている情報を結果として返すというものです。例えば「kitty」という単語を与えると「仔猫」という結果を返すことで、英和辞書サービスを実現することができます。
Webサービスとしてこの機能を実現するには、クライアントから辞書サービスを提供するURIに接続し、HTTPのGETメソッドでコンテンツを要求します。サーバ側では、要求されたコンテンツを返す必要がありますが、当然この結果は動的なものでなければならず、事前に用意されたファイルなどではありません。クライアントから接続するURIは何らかのスクリプトを起動することになります。
辞書サービスを提供するサーバ側スクリプトは、クライアントからキーとなる値を受け取らなければ結果を返すことができません。この値は、GETメソッドで呼び出された場合はURIのクエリから取得できます。クエリは、URIの末尾に次の様な形で指定することができます。
?名前=値
名前には、サーバ側スクリプトに渡すパラメータの名前を、値には名前に関連付けられた値を指定します。&記号で区切ることによって複数の値を指定することも可能ですが、この場では辞書を引くためのキーを1つだけ渡せばよいので、次のような形になります。
?key=kitty
この場合、辞書サービスに対してkittyという名前のキーを渡すことになります。サーバ側では、この値をキーとして利用し、関連付けられている値を検索して結果を返せばよいということになります。
このサーバ機能の実装は、これまでのWebアプリケーションとほとんど変わりありません。辞書の結果がブラウザで表示可能な完成されたHTMLであれば、これはWebアプリケーションであると考えることができます。まずは、従来型のWebアプリケーションとして上記の辞書機能を実装してみましょう。
<?php $key = $_GET['key']; $DIC = array( "kitty" => "仔猫", "kitten" => "仔猫", "cat" => "猫", "siamese" => "シャム", "tortoiseshell" => "三毛", "persian" => "ペルシャ" ); ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>辞書の結果</title> </head> <body> <?php print '<h1>' . $key . '</h1>'; print '<p>' . $DIC[$key] . '</p>'; ?> </body> </html>
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>辞書アプリケーション</title> </head> <body> <h1>単語を入力してください</h1> <form method="GET" action="dic.php"> <input type="text" name="key" /> <input type="submit" value="送信" /> </form> </body> </html>


本稿では、サンプルを単純化するためにソースコード上の$DIC変数に保存している配列で辞書データを表しています。実用的な辞書では数万という単位の項目を扱うことが予想されるため、データベースにすべての情報を保存し、スクリプトはクライアントが要求したキーからクエリを生成してデータベースから情報を取得する形になるでしょう。
dic.htmlはdic.phpを実行するために必要なパラメータを入力するためのフォームを表示します。テキストボックスに入力された文字列は「送信」ボタンを押すとGETメソッドでdic.phpに渡されます。実際には、フォームを使わなくても次のようなURIからdic.phpを表示することができます。
- http://localhost/dic.php?key=siamese
辞書の目的は指定したキーに対応する結果を要求するものなので、PUTやPOSTメソッドを使うのは適切ではありません。GETメソッドであれば、上記のようにURIから簡単に辞書を引くことができるため、ブラウザ以外のアプリケーションからでもアクセスしやすくなります。
アプリケーションの問題点
上記のサンプルは、入力された単語に関連する結果を返すWebアプリケーションとして機能しました。PHPが出力した結果はHTML文書であり、この結果は単語情報が構造化されたものではありません。例えば「シャム」というのはただの文章であり、これが名詞なのか動詞なのかといった構造化された情報は持ち合わせていません。
上記のサンプルは極めて単純な結果ですが、実用的な辞書であれば1つの英単語に対しても動詞、名詞、形容詞などの品詞ごとに意味が異なるため、品詞と意味を関連付けた構造的なデータを返す必要が出てくるでしょう。また、単語の意味だけではなく、実例や補足などの情報も返したいと思うかもしれません。
HTMLでは、こうした辞書の結果を表示することは可能ですが、アプリケーションが意味を解釈することができません。また、アプリケーションがデータを加工したり、画面レイアウトを自由に変更することは困難です。
これに対して、Webサービスは外部のアプリケーションの要求に対して、意味を解釈できる何らかのデータを返します。XMLであれば、DOMが実装されている環境なら容易に文書から個別のデータを取り出すことができます。
