POSTとGET

GETメソッドとPOSTメソッドでリクエストする入力フォームと、サーバサイドで結果を返すCGIを作成。とほほを見て始めたんですが、二つのことを一緒にやろうとしたので、何度もくじけて、結果的に時間かかってしまった。

入力フォーム

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
	"http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>form.html</title>
<link rel="shortcut icon" href="favicon.ico">
</head>
<body>
<form method="GET" action="/cgi-bin/form.cgi">
	<input type=hidden name="hl" value=ja>
	<input type=text name="data" maxlength=2048 size=55 value="">
	<input type=submit name="btn" value="GET">
</form>
<form method="POST" action="/cgi-bin/form.cgi">
	<input type=hidden name="hl" value=ja>
	<input type=text name="data" maxlength=2048 size=55 value="">
	<input type=submit name="btn" value="POST">
</form>
</body>
</html>

CGI

文法はまだまだ。でも、しばらくはこれで遊べると思う。

#!/usr/bin/perl

# フォームに指定した値を読込みます
if ($ENV{'REQUEST_METHOD'} eq "POST") {
	# POSTであれば標準入力から読込みます
	read(STDIN, $data, $ENV{'CONTENT_LENGTH'});
} else {
	# GETであれば環境変数から読込みます
	$data = $ENV{'QUERY_STRING'};
}

# &で区切られたものを配列へ代入します
@assocarray = split(/&/, $data);

# ハッシュ(keyとvalue)に分けます
foreach $assoc (@assocarray) {
	($key, $value) = split(/=/, $assoc);

	# URLエンコーディングされた値をデコードします
	$value =~ tr/+/ /;
	$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
	$in{$key} = $value;
}

print << "EOF"
Content-type: text/html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
	"http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>cgi_form.cgi</title>
<link rel="shortcut icon" href="favicon.ico">
</head>
<body>
<h1>メソッド、送信内容の確認</h1>
<table border=1 cellspacing=1 cellpadding=3
	summary="メソッド、送信内容の確認">
	<tr><th>key</th><th>value</th></tr>
	<tr><td>submmit</td><td>$in{btn}</td></tr>
	<tr><td>hidden</td><td>$in{hl}</td></tr>
	<tr><td>text</td><td>$in{data}</td></tr>
</table>
</body>
</html>
EOF