GETのリクエストメッセージには、ボディ部がありません。
リクエストメッセージ内のボディ部を利用する場合は、POSTのリクエストメッセージを使います。
簡単な利用方法として、HTMLの<form>タグを使う方法があります。次にその例となるHTMLを示します。
これで、ブラウザ側の<form>タグ情報を、リクエストメッセージのボディ部に入れて送り出されます。
<html lang="ja"> <head> <title>Formオブジェクト</title> </head> <body> <h1>Formオブジェクト</h1> <form action="ctest.exe" method="post" name="form1"> ラジオボタン オブジェクト <input type="radio" name="rbtn1" value="R1" checked> <input type="radio" name="rbtn1" value="R2"> <input type="radio" name="rbtn1" value="R3"><br> チェックボタン オブジェクト <input type="checkbox" name="cbtn1" value="C1" checked> <input type="checkbox" name="cbtn1" value="C2"><br> テキストフィールド オブジェクト <input type="text" name="txt1" value="ABCあいう123" size="20"><br> セレクトメニュー オブジェクト <select name="lst1" size="3" tabindex="0"> <option value="ListA">項目A</option> <option value="ListB" selected="selected">項目B</option> <option value="ListC">項目C</option> </select> <br> 送信ボタン <input type="submit" value="submit" size=20><br> </form> </body> </html>
このHTMLでsubmitボタンをクリックした時に送られるリクエストメッセージを以下に示します。
POST /test/ctest.exe HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */* Referer: http://192.168.0.33/test/formtest.html Accept-Language: ja Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 2.0.50727) Host: 192.168.0.33 Content-Length: 58 Connection: Keep-Alive Cache-Control: no-cache rbtn1=R1&cbtn1=C1&txt1=ABC%82%A0%82%A2%82%A4123&lst1=ListB
■がリクエストメッセージのボディで、formタグの内容です。form内の各種inputに設定した値が、
各name後の=直後に設定され、それらが&で区切られて並んでいます。
例えば、txt1のテキストには『ABCあいう123』が入力されているのでその値は、
ABC%82%A0%82%A2%82%A4123になっています。
この変換には URLエンコードが使われています。
上記リクエストメッセージを処理するにはHTMLのform内のactionで指定した『ctest.exe』の実行ファイルがサーバ側に必要で、それを実行させるのは、サーバが担当します。
このformタグの情報は、リクエストメッセージボディ部に存在しますが、CGIで動作させるサーバの場合、
単純にこのボディ部が標準入力(stdin)を介して渡されます。
そして実行時の標準出力が応答メッセージのボディ部にセットされてブラウザにもどされます。
以下にその確認用プログラムの例をC言語で示します。
#include <stdio.h>/* 実験用cgi のプログラムソースtestcgi.c */ main() { char buf[1024]=""; int n=0; int c; printf("<html>\n"); while(n < sizeof(buf)-1 && (c=getchar()) != EOF && c != '\n'){ buf[n++]=c; } buf[n]='\0'; printf("『%s』の%dbyte受信しました\n\n", buf, n); printf("</html>\n\n"); }
このCGIを使ったブラウザの表示例を以下に示します。
これで、このURLエンコードされた文字列を解読してみましょう。