[Edit][Create New]
[ IndexPage / ネットとプログラミング / web296 / No30.txt ]

No30.txt

今回は、CGIにアクセスする時のブラウザの挙動を解説します。実は、ブラウザ
からHTTPサーバーへのデータの受け渡し方法は大まかにわけて2つあり、それぞ
れGETとPUTと呼ばれています。

CGIスクリプトを呼び出すHTMLファイルをエディタなどで見てみると、

<FORM ACTION="CGIスクリプト名" METHOD="GET">

などとなっているのを見かけると思います。ブラウザは、ここの「GET」の部分
でCGIスクリプトにデータを渡す方法を判断します。METHOD="方法"の部分は省略
可能ですが、HTML4.01では、これを省略した場合は「GET」が指定されたものと
みなすような仕様になっています。

さて、それではそれぞれのデータの渡し方を見てみましょう。まずはGETです。
例えば、

<FORM ACTION="http://web296.com/testprog.cgi" METHOD="GET">
名前<INPUT TYPE=TEXT NAME="name"><BR>
趣味<INPUT TYPE=TEXT NAME="hobby"><BR>
<INPUT TYPE=SUBMIT>
</FORM>

というフォームがあり、「名前」に「Masakatz Canada」、「趣味」に
「drinking」と書いてSubmitボタンを押すと、ブラウザからHTTPサーバーには
以下のようなリクエストが送られます。

GET /testprog.cgi?name=Masakatz%20Canada&hobby=drinking HTTP/1.1
Host: web296.com

実は、GETの場合は単にINPUT要素のNAME属性で指定された値と、ユーザーが入力
した値を「=」でつないだ対を、さらに「&」文字で繋げて、CGIスクリプトの相
対URLの後ろに「?」文字を補って指定しているだけなのです。この表記は、通常
のブラウザではURL欄にも現れるので、見覚えのある方もいるかと思います。

つまり、GETという方法は、今までのHTMLファイルの呼び出し方法と全く変わら
ないわけです。CGIスクリプトは、HTTPサーバーが自動的に「?」文字を探して
CGIスクリプトのファイル名を切り出して起動され、「?」以降をCGIスクリプト
に渡す仕様になっています。

この方法は、FORM要素を使わなくても、<A HREF="a.cgi?neta=ganmo">のように
A要素のHREF属性に直接CGIスクリプトに渡すデータを記述できるなどの長所があ
ります。逆に、URLの長さはRFCで制限されていますので、あまり巨大なデータは、
正しく渡されることが保証されない、という欠点も持っています。

ではPUTはどうでしょうか? こちらは新しい概念が登場します。GETの例を見れば
想像がつくでしょうが、今度はGETの代わりにPUTという新しいコマンド(リクエ
スト・メソッド)を使うのです。HTMLファイルの中で、METHOD=PUTを指定すると、
ブラウザは以下のようなリクエストをHTTPサーバーに送ります。

PUT /testprog.cgi HTTP/1.1
Host: web296.com
Content-Length: 37

name=Masakatz%20Canada&hobby=drinking

GETであれば、HTTPヘッダの終了である空行をサーバーに送ればそれでブラウザ
からの命令は終了だったのですが、PUTの場合はさらに入力待ちになり、
Content-Length: ヘッダで指定された文字数分データを受け取るまでその状態が
続きます。

PUTは、URLの一部にデータを埋め込むという事をせず、HTTPヘッダの後(=空行
より後。これをBody部と呼びます)の部分にデータを入力させるので、データ長
に制限がないという長所があります。ただし逆に、いくらでも巨大なデータが受
け取れるため、メモリやハード/ディスク領域を浪費させるいたずらに留意する
必要がでてきます。

最近、フォト・アルバムCGIスクリプトなど、ファイルをアップロードさせるタ
イプのCGIスクリプトを良く見かけますが、これもこのPUTを使っているのです。

さて、今回は、ブラウザがどうやってCGIスクリプトにデータを送信するか解説
しました。次回は、人気投票の結果をみて、なお好評なようなら、HTTPでの、無
駄なトラフィックを防ぐための工夫を解説していこうかと思います。