ウィリアムのいたずらの開発日記

ウィリアムのいたずらが、コンピューター関係について、思ったことを好き勝手に書いているブログです。

CGI(Perl)でHTTPのPOST型で他サイトにアクセスして、内容を取得する方法

2006-03-05 12:03:35 | JavaとWeb


 POST型でWebアプリとしてアクセスするということについて、かなり書いているけど、PHPについては、ここにかきましたけど、Perl(CGI)では?というのについては、書いてないので、今日取り上げてみました。

 なお、JAVAでやる場合については、ウィリアムのいたずらのホームページの
 ここ
http://www.geocities.jp/xmldtp/jv_post.htm

 
VC++は、あ、Get型しかかいてないけど、それについてはここ




 今回、ここに書いてあることにインスパイアされて、作ってみました。
 こんなかんじ。
#!c:/perl/bin/Perl.exe
use Socket;

$HOST    = '127.0.0.1';
$PORT    = '80';
$PATH   = '/cgi-bin/formsend.cgi';
$TIMEOUT = '10';

$QUERY = 'abcd=123'; # 適当に入れてください。

print "Content-Type: text/xml¥n¥n";
print Header_Cut(Location_Post($HOST, $PORT, $PATH, $QUERY));

exit;

#
#==============================================//
#	Postで送信する	 			//
#	$host ホスト名				//
#	$port ポート番号			//
#	$path ホストのHomeからのパス(/で始まる)	//
#	$msg  送信内容				//
#	返り値:ヘッダーつきデータ		//
#==============================================//

sub Location_Post($$$$)
{

        my($host, $port, $file, $query) = @_;
        my($len) = length($query);

        # ソケットのオープン
        if (!socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp')))
	{
		return "error:open socket";
        }

        # ポートへの接続
        if (!connect(SOCK, sockaddr_in($port,inet_aton($host))))
	{
                close(SOCK);
		return "error:connect socket";
        }

        # ソケットのバッファリングを停止
        select(SOCK);
        $| = 1;
        select(STDOUT);


        # HTTP 要求ヘッダー
        # POST メソッドで要求します。
        print SOCK "POST $file HTTP/1.0" . "¥r¥n";

        # Content-Length: を送る(クエリーのバイト数)
        # ヘッダーの最後は2回改行する
        print SOCK "Content-Length: $len" . "¥r¥n¥r¥n";

        # POST 内容送信
        print SOCK "$query";

        # タイムアウトアラーム開始
        $SIG{'ALRM'} = ¥&_socket_timeout;
        alarm($TIMEOUT);

        # 受信
	$ret = "";
        while(<SOCK>)
	{
		$ret = $ret . $_;
        }

        # タイムアウトアラーム解除
        alarm(0);

        # ソケットを閉じる
        close(SOCK);

	return $ret;
}


#===============================================//
# ソケット通信タイムアウト時の処理		//
#==============================================//
sub _socket_timeout
{
        close(SOCK);
        exit;
}
#==============================================//
#	ヘッダーをきる	 			//
#	$buf  :ヘッダーつきデータ		//
#	返り値:ヘッダをカットした本文		//
#==============================================//
sub Header_Cut($)
{
        my($msg) = @_;
	$pos = index($msg,"¥r¥n¥r¥n");
	if ( $pos >= 0 )
	{
		$pos += 4;
	}
	else
	{
		$pos = index($msg,"¥n¥n");
		if ( $pos >= 0 )
		{
			$pos += 2;
		}
	}

	if ( $pos	<	0 )
	{
		return "error";
	}

	return substr($msg,$pos);
}

(上記 < > ¥ は本当は半角です)

 なお、上記のプログラムはhttp://127.0.0.1/cgi-bun/formsend.cgi(ポートは80)にPOSTで「abcd=123」と送ります。




なお、その際に参考になったサイト
http://ash.jp/perl/socket_http.htm

http://hp.vector.co.jp/authors/VA003991/kouza/senior/kouza_socker_perl.html



ジャンル:
その他
この記事についてブログを書く
この記事をはてなブックマークに追加 mixiチェック
« マイクロソフトの「Origami」っ... | トップ | Firefoxが普及しない理由って、... »
最近の画像もっと見る

あわせて読む