2. XML-RPC とは?

XML-RPC は HTTP 上 でリモート手続き呼び出しを行うための簡単で手軽な方法です。Perl, Java, Python, C, C++, PHP や多くの他のプログラミング言語で使用できま す。Unix と Windows, Macintosh 上で利用可能です。

Perl で書かれた短い XML-RPC クライアントを示します (Ken MacLeod の Frontier::Client を使用します)。

use Frontier::Client;
$server = Frontier::Client->new(url => 'http://betty.userland.com/RPC2');
$name = $server->call('examples.getStateName', 41);
print "$name\n";

実行すると、このプログラムはリモートのサーバに接続し、州名を得 て、それを表示します (この例の州番号 41 は South Dakota のはずです)。

Python での同じプログラムです (これでは Fredrik Lundh の xmlrpclib を使います)。

python> import xmlrpclib
python> server = xmlrpclib.Server("http://betty.userland.com/RPC2")
python> server.examples.getStateName(41)
'South Dakota'

以降の章では、様々な言語で XML-RPC クライアントおよびサーバの書 き方を学びます。

2.1. どのように動作するのか

XML-RPC は Dave Winer の公式仕様書で詳細に説明さ れています。興味があるなら、是非ご覧になってください。簡潔で明解な 文書です。

通信する上で、XML-RPC の値は XML にエンコードされます -

<methodCall>
  <methodName>sample.sumAndDifference</methodName>
  <params>
    <param><value><int>5</int></value></param>
    <param><value><int>3</int></value></param>
  </params>
</methodCall>

上記は冗長ですが、簡単に圧縮できます。また、予想以上に速い です - Rick Blair の測定によれば、Hannes Walln?er の Java での実装を使うと XML-RPC 呼び出しの応答時間は 3 ミリ秒です。

2.2. サポートされるデータの種別

XML-RPC は以下のデータの種別をサポートします。

int

符号付 32 ビット整数

string

ASCII 文字列で空バイトも許されます。(実際にはたくさんの XML-RPC の実装が Unicode をサポートしています。XML の基本機 能に感謝。)

boolean

真か偽のどちらか

double

倍精度浮動小数点実数 (実際にはいくつかの実装で使えない かもしれません)

dateTime.iso8601

日付と時刻。残念ながら、XML-RPC はタイムゾーンの使用を 禁止しているので、これはほとんど役に立ちません。

base64

任意長の生のバイナリデータ - 通信上 Base64 を使用して エンコードされます。とても役立ちます (けれどもいくつかの実装 では 0 バイトのデータ受信が行えません)。

array

値の一次元配列。個々の値はどんな種別でもかまいません

struct

キーと値の集まり。キーは文字列です - 値はどんな種別 でもかまいません。

2.3. XML-RPC の歴史

XML-RPC は、先行する二つのプロトコルから着想を得ています。そ の一つは、anonymous RPC であり、これは Dave Winer により設計され、 過去に DaveNet でのエッセイとして発表されたものです (XML-RPC サー バが /RPC2 下にインストールされることが多いの はこのためです)。もう一つの、より重要な着想は、SOAP プロトコルの初 期ドラフトによるものです。

より詳しい XML-RPC の歴史という文書を Dave Winer が提供してくれてい ます。この文書では、XML-RPC と SOAP との関係についても説明されてい ます。