ねもぷらす

ふぁいんでぃんぐねもの日記。プログラミングとか育児とか

XML-RPCで遊ぶ

なんとなくわかってきた雰囲気。
全部スクリプトで動かせば、何がどう動いているのかわかる雰囲気。

環境

必要なモノ 用途 備考
Apache webサーバ 1.xでも2.xでも可。
Perl App 必須
webブラウザ webブラウザ 必須。このページが見えてる時点でok

Perlモジュール

cpanで入れれば無問題。

必要なモノ 用途 備考
CGI CGIを使うから
Frontier::RPC2 XML-RPCに利用

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;
}

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 を使った方法を模索中。
ハッカーになった気分。気分だけで十分なんです(*^ー^*)