前のブログに書いたとおり、AJAXで、そのプログラムが置いてある以外のサーバーにアクセスするためには、
・以下のようなトンネルCGIを使って、
・トンネルCGIが複数のサイトにアクセスするようにして、
・その結果を、AJAXプログラムが利用し、クライアントに返すと
いう形にしないといけない
クライアント<===>AJAXプログラム ↑ ↓ *----*<====>サイトA |トンネル|<====>サイトB |CGI |<====>サイトC *----* :
・AJAXプログラムとトンネルCGIは、同じサーバーのところにある。
では、このような、トンネルCGIをどうやって作るかというお話。
これは、CGIが、他のサイトにアクセスして、その結果を、そのまま出力する(呼び出し側に返す)ことで実現できる。
POST型において、このケースは、すでに
CGI(Perl)でHTTPのPOST型で他サイトにアクセスして、内容を取得する方法
に書いてある。
では、Get型ではどうか?という話ですけど、
Getで、
print "Location: http://とびたいさき";
と書いても、AJAXで利用できない(結局、飛びたい先のURLにアクセスしようとするため、結果を受け取れない)。
というわけで、上記にあげたPOST型のプログラムをGetに改造することになる。
ここで、
http://jws.jalan.net/content/data/area.xml
っていうところにアクセスしたいとしよう。
え、なぜ、そのサイトだって、理由は聞くな。一部の人にはわかるであろう。
その場合は、POST型の例の「exit;」までを、こう直します。
#!c:/perl/bin/Perl.exe use Socket; $HOST = 'jws.jalan.net'; $PORT = '80'; $PATH = '/content/data/area.xml'; $TIMEOUT = '10'; $QUERY = ''; # 今回は引数はないので”” print "Content-Type: text/xml¥n¥n"; print Header_Cut(Location_Post($HOST, $PORT, $PATH, $QUERY)); exit; |
(上記 < > ¥は、本当は半角です)
つまり、$HOSTと$PATHを直します。これは、違うところにアクセスしたい場合は、そのサイト名に変えてください。
$QUERYは今回、引数無しなので、こんなかんじ
そして、プログラムについては、
print SOCK "POST $file HTTP/1.0" . "¥r¥n";
ってかいてあるところを
print SOCK "GET $file HTTP/1.0" . "¥r¥n";
にして、
その後
print SOCK "Content-Length: $len" . "¥r¥n¥r¥n";
ってかいてあるところを
print SOCK "¥r¥n¥r¥n";
にします
そのへんをまとめると、こんなかんじ
# HTTP 要求ヘッダー # POST メソッドで要求します。 # print SOCK "POST $file HTTP/1.0" . "¥r¥n"; # こんかいはGETなので、こうします print SOCK "GET $file HTTP/1.0" . "¥r¥n"; # Content-Length: を送る(クエリーのバイト数) # ヘッダーの最後は2回改行する # print SOCK "Content-Length: $len" . "¥r¥n¥r¥n"; print SOCK "¥r¥n¥r¥n"; |
(上記 < > ¥は、本当は半角です)
POSTでもGetでもどっちでもOKにしたり、もっと汎用的にするためには、引数で、いろいろ受け取って、処理しないといけないわけだけど、それを書き出すと複雑になるので、今回は省略です。