■前置き
- 自己責任でソースをご利用ください
- 正直、美しくない部分はある↓
- 結構適当なのでサンプルソース程度に見てください
■ソースコード
#!/usr/bin/perl
#ここで送信データーを読み取る
&getFormData();
%query;
$query{'par1'} = 'ここにリクエスト用のパラメーター1';
$query{'par2'} = 'ここにリクエスト用のパラメーター2';
$query{'par3'} = 'ここにリクエスト用のパラメーター3';
$query{'par4'} = 'ここにリクエスト用のパラメーター4';
#下記はHTML上からname="data"ハッシュキーを送信させ
#上記に該当するときは他サーバーとの通信を行う。
#それ以外はエラー処理。
if($query{$FORM{'data'}}){
&socketCom($query{$FORM{'data'}});
}
else{
&errorPrint();
}
#=================================
#下記、他のサーバーとソケット通信するためのサブルーチン
sub socketCom{
my($addr, $name);
#下記、ホスト名を$addrへ
$addr = (gethostbyname('api.gnavi.co.jp'));
$name = pack("S n a4 x8″, 2, 80, $addr);
#下記、ソケットの生成。
#引数はソケットハンドラ、ソケットのドメイン、タイプ、プロトコル
socket(GNAVIHANDLE, 2, 1, 0);
#下記、接続。引数はハンドラ、IPアドレスとポート番号
connect(GNAVIHANDLE, $name);
binmode(GNAVIHANDLE);#バイナリモード
select(GNAVIHANDLE);#出力先デフォルトハンドルの設定
$| = 1;#バッファリングの設定(0以外でバッファリングを無効に)
select(stdout);#出力先を初期の状態に
#下記で接続先にリクエストを送信
print GNAVIHANDLE "GET http://api.gnavi.co.jp/ver1/$_[0] HTTP1.0\r\n\r\n";
while(<GNAVIHANDLE>){
#APIから返ってくるXMLをクライアントに返す時はこんな感じ
#<?xml以降をクライアントに送信
if($_ =~/<?xml/){$boolean = 1;}
if($boolean){print $_;}#前行の処理が実行されるとprintが実行される
}
close(GNAVIHANDLE);#soketをclose
}
#————–
sub getFormData{
my($query, $pair);
if($ENV{'REQUEST_METHOD'} eq 'POST'){
read(STDIN, $query, $ENV{'CONTENT_LENGTH'});;
}else{$query = $ENV{'QUERY_STRING'};}
foreach $pair(split(/&/,$query)){
my($key, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$FORM{$key} = $value;
}
}
#————–
sub errorPrint{
#エラー用処理の記述
}
#--------------
■注意点
- http://api.gnavi.co.jp/ver1/はぐるナビのAPIのアドレス
- 悪用される危険があるため、サーバーの接続先URLに任意の文字列が入力されてしまうソースは決して書かないで下さい
- http://api.gnavi.co.jp/ver1/$_[0]部分にクライアント側から任意の文字列を入れられると危険
- ソースの解説はコメント形式で上記に載せてみました(#以降~行末がコメント)