XML-RPCで遊ぶ
なんとなくわかってきた雰囲気。
全部スクリプトで動かせば、何がどう動いているのかわかる雰囲気。
Perlモジュール
cpanで入れれば無問題。
必要なモノ | 用途 | 備考 |
---|---|---|
CGI | CGIを使うから | |
Frontier::RPC2 | XML-RPCに利用 |
- XML-RPC Server
HowToXMLからまんまパクリ。
最初の 1行目は環境に合わせて使うこと〜CGIを動かせる場所に置くこと〜
ex)ファイル名:/usr/local/apache/cgi-bin/sumAndDifference.cgi
ex)ファイルパス:http://127.0.0.1/cgi-bin/sumAndDifference.cgi
#!/usr/bin/perl -w use strict; use Frontier::RPC2; sub sumAndDifference { my ($x, $y) = @_; return {'sum' => $x + $y, 'difference' => $x - $y}; } process_cgi_call( { 'sample.sumAndDifference' => \&sumAndDifference } ); sub process_cgi_call ($) { my ($methods) = @_; # Get our CGI request information. my $method = $ENV{'REQUEST_METHOD'}; my $type = $ENV{'CONTENT_TYPE'}; my $length = $ENV{'CONTENT_LENGTH'}; # Perform some sanity checks. http_error(405, "Method Not Allowed") unless $method eq "POST"; http_error(400, "Bad Request") unless $type eq "text/xml"; http_error(411, "Length Required") unless $length > 0; # Fetch our body. my $body; my $count = read STDIN, $body, $length; http_error(400, "Bad Request") unless $count == $length; # Serve our request. my $coder = Frontier::RPC2->new; send_xml($coder->serve($body, $methods)); } sub http_error ($$) { my ($code, $message) = @_; print <<"EOD"; Status: $code $message Content-type: text/html <title>$code $message</title> <h1>$code $message</h1> <p>Unexpected error processing XML-RPC request.</p> EOD exit 0; } sub send_xml ($) { my ($xml_string) = @_; my $length = length($xml_string); print <<EOF; Status: 200 OK Content-type: text/xml EOF print $xml_string; }
- XML-RPC Client
CGIクライアントをテキトーに作ってみた。セキュリティ云々はまだよくわかっていませんorz
最初の 1行目は環境に合わせて使うこと〜CGIを動かせる場所に置くこと〜
ex)ファイル名:/usr/local/apache/cgi-bin/client.cgi
ex)ファイルパス:http://127.0.0.1/cgi-bin/client.cgi
#!/usr/bin/perl -w use strict; use warnings; use CGI; use Frontier::Client; eval{ my $q = new CGI; my $server_url = 'http://127.0.0.1/cgi-bin/sumAndDifference.cgi'; my $server = Frontier::Client->new(url => $server_url); # Call the remote server and get our result. my $result = $server->call('sample.sumAndDifference', 5, 3); my $sum = $result->{'sum'}; my $difference = $result->{'difference'}; print $q->header, $q->start_html('hello world'), $q->h1('hello world'), $q->h2("call URI : ".$server_url), $q->h2("Sum: ".$sum.", Difference: ".$difference), $q->end_html; 1; }; if( my $err = $@ ){ print "Exception : " . $err . "\n"; return; }
所詮スクリプトなので、コピペすれば簡単に動きます。
XMLRPC::lite を使った方法、SOAP::lite を使った方法を模索中。
ハッカーになった気分。気分だけで十分なんです(*^ー^*)