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 应该是南达科他州。)

这是用 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. 工作原理

Dave Winer 的 官方规范中完整地描述了 XML-RPC。如果您好奇,请继续查看——这是一篇快速且直截了当的阅读材料。

在网络传输中,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�fer 的 Java 实现,一次往返 XML-RPC 调用需要 3 毫秒。

2.2. 支持的数据类型

XML-RPC 支持以下数据类型

int

一个有符号的 32 位整数。

string

一个 ASCII 字符串,可能包含 NULL 字节。(实际上,由于 XML 的底层特性,一些 XML-RPC 实现支持 Unicode。)

boolean

真或假。

double

一个双精度浮点数。(在某些实现中,精度可能受到限制。)

dateTime.iso8601

日期和时间。不幸的是,由于 XML-RPC 禁止使用时区,这几乎是无用的。

base64

任意长度的原始二进制数据;在网络传输中使用 Base64 编码。非常有用。(尽管有些实现不喜欢接收零字节的数据。)

array

一个一维的值数组。单个值可以是任何类型。

struct

键值对的集合。键是字符串;值可以是任何类型。

2.3. XML-RPC 的历史

XML-RPC 的灵感来自两个早期的协议。第一个是 Dave Winer 设计的匿名 RPC 协议,并在 一篇旧的 DaveNet 文章中宣布。(这就是为什么 XML-RPC 服务器通常安装在/RPC2。)另一个更重要的灵感是 SOAP 协议的早期草案。

Dave Winer 慷慨地提供了一个更长的 XML-RPC 历史。这也解释了 XML-RPC 和 SOAP 之间的关系。