クライアントFormとサーバ間やり取り

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エンコードされた文字列を解読してみましょう。