Ken MacLeod は Perl 用 XML-RPC を実装しています。彼の Frontier::RPC モジュールは彼のウェブサイトもしくは CPAN を通じて入手できます。
Frontier::RPC をインストールするには、標準的なやり方でパッケー ジをダウンロードしてコンパイルします -
bash$ gunzip -c Frontier-RPC-0.07b1.tar.gz | tar xvf - bash$ cd Frontier-RPC-0.07b1 bash$ perl Makefile.PL bash$ make bash$ make test bash$ su -c 'make install' |
(ウィンドウ環境やルート権限の無い場合、わずかに違った手順とな るでしょう。詳細は Perl の文書を参考にしてください。)
次のプログラムは Perl から XML-RPC サーバのコールの方法を示 します。
use Frontier::Client; # Make an object to represent the XML-RPC server. $server_url = 'http://xmlrpc-c.sourceforge.net/api/sample.php'; $server = Frontier::Client->new(url => $server_url); # Call the remote server and get our result. $result = $server->call('sample.sumAndDifference', 5, 3); $sum = $result->{'sum'}; $difference = $result->{'difference'}; print "Sum: $sum, Difference: $difference\n"; |
The following program shows how to write an XML-RPC server in Perl:
次のプログラムは Perl での XML-RPC サーバの書き方を示します。
use Frontier::Daemon; sub sumAndDifference { my ($x, $y) = @_; return {'sum' => $x + $y, 'difference' => $x - $y}; } # Call me as http://localhost:8080/RPC2 $methods = {'sample.sumAndDifference' => \&sumAndDifference}; Frontier::Daemon->new(LocalPort => 8080, methods => $methods) or die "Couldn't start HTTP server: $!"; |
Frontier::RPC2 は CGI ベースサーバ用のサ ポートは本来備えられていません。しかし大丈夫、 必要なほとんどの機能は用意されています。
次のプログラムコードを sumAndDifference.cgi として、ウェブサーバの cgi-bin ディレクトリに保存してください (Unix システム上で、chmod +x 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}); #========================================================================== # CGI Support #========================================================================== # Simple CGI support for Frontier::RPC2. You can copy this into your CGI # scripts verbatim, or you can package it into a library. # (Based on xmlrpc_cgi.c by Eric Kidd <http://xmlrpc-c.sourceforge.net/>.) # Process a CGI call. 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)); } # Send an HTTP error and exit. 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; } # Send an XML document (but don't exit). sub send_xml ($) { my ($xml_string) = @_; my $length = length($xml_string); print <<"EOD"; Status: 200 OK Content-type: text/xml EOD # We want precise control over whitespace here. print $xml_string; } |
あなた自身の CGI スクリプトにユーティリティルーチンをコピー してもかまいません。