おもこん

おもこんは「思いつくままにコンピュターの話し」の省略形です

cgiの作り方(3)

FORM(続き)

HTTP のはなし

FORMタグで指定する属性に、method がありました。今回のシリーズでは、 POST メソッドだけを扱うといいましたが、POST 以外に GET というメソッドも使えます。このメソッドというのは、HTTPプロトコルで定義されているもので、ここで少し説明しておきます。

まず HTTP というのは、ウェブサーバとブラウザでデータのやりとりをするためのプロトコル(通信の決まり)のことです。ブラウザからサーバに通信する時は、その通信をリクエスト(要求)といい、サーバがそのリクエストに対してデータを返す(応答する)ことをレスポンスといいます。リクエストで送られるデータ(の全体)をリクエスト・メッセージ、レスポンスで送られるデータ(の全体)をレスポンスメッセージといいます。それぞれのメッセージは次のような構造になっています。

リクエストメッセージ
  リクエスト・ライン
  ヘッダ(一般ヘッダ、リクエストヘッダ、エンティティヘッダ)
  エンティティ

レスポンスメッセージ
  ステータス・ライン
  ヘッダ(一般ヘッダ、レスポンスヘッダ、エンティティヘッダ)
  エンティティ

htmlの文書はレスポンスメッセージのエンティティに格納されます。ですから、エンティティというのはメッセージの本体に当たります。

さて、リクエスト・ラインはその1行の中に
 メソッド URI HTTPのバージョン
が書かれています。例えば
GET http://www.sample.ac.jp/jeaou/page1.html HTTP/1.1
という具合です。メソッドというのはサーバに対する命令のようなもので、それによってサーバが応答するのです。

GETというメソッドはURIで示された場所にあるリソース(多くの場合これはhtml文書です)を送ってくれ(つまりブラウザがゲットするようにしてくれ)という命令です。ですからGETの場合リクエストメッセージにはエンティティ(本体)は含まれません。本来はGETではデータを送ることができないのです。では、FORMでメソッドをGETにする場合はどうやってデータを送っているかというと、URIの最後にデータを付加して送ります。URIとデータの間に区切りとして?(クエスチョンマーク)が入ります。例えば「name=jeaou」というデータをGETメソッドで送るときのURIは
http://www.sample.ac.jp/jeaou/sample.cgi?name=jeaou
となります。

URIに追加してデータを送る場合、どんな文字も送れるわけではありません。まず、ASCIIコードしか送れません。ですから日本語のコードは後で述べるような変換(エンコード)をしなければなりません。また、ASCIIコードでも空白とか<>%などは送ることができないのでエンコードをして送ります。このエンコードをURLエンコーディングといいます。

POSTというメソッドはデータを送る為のメソッドで、データはエンティティとして送られます。GETと比べ多くのデータを送ることができる。エンコードもURLエンコードがデフォルトですが、他のエンコードも可能であるなど、GETよりも有利なメソッドです。

application/x-www-form-urlencoded エンコーディング

ブラウザからサーバにデータを送る時のURLエンコーディングはapplication/x-www-form-urlencoded エンコーディングとも呼ばれます。FORMタグでエンコーディングを指定しなければこのエンコーディングになります。なお、先程述べたようにGETではこのエンコーディングしかありません。

このエンコーディングでは、予約文字として転送時に特殊な目的で使われている文字などは、そのまま送ることができません。例えば、「<」や「>」などです。その場合は、その文字コードに%をつけて送ります。例えば「<」の文字コード(ASCIIコード)は、16進数で3Cなので、%3Cとなります。同じく「>」は文字コード3Eなので、%3Eとして送ります。この他に +,{,},|,\,^,~,[,],`などがあります。

半角スペースもそのままで送ることができません。半角スペースは、「+」になって送られます。

日本語もそのままでは送ることができません。同様に文字コードに%をつけて送ります。日本語には複数の文字コードがあります。
UTF-8
EUC
CP932 (Shift-jis)
ISO2022 (JIS)
UTF-8の場合、日本語1文字を3バイトで表現します。例えば、ロビンソンのロは「E3 83 AD」です。これを転送するときには、「%E3%83%AD」として送ります。ロビンソンを送ったときの転送表現を以下に示しましょう。
%E3%83%AD%E3%83%93%E3%83%B3%E3%82%BD%E3%83%B3
もう少し分かりやすくすると、
%E3%83%AD %E3%83%93 %E3%83%B3 %E3%82%BD %E3%83%B3
ロ        ビ        ン        ソ        ン

まとめ


1 予約文字などは%の後に文字コードをつけた形に変えて送られる。

2 日本語も%の後に文字コードをつけた形に変えて送られる。

3 日本語には、複数の文字コードがある。転送されたデータそのものにはどの文字コードを使っているかの情報は含まれていない。