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 客户端和服务器。
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 毫秒。
XML-RPC 支持以下数据类型
一个有符号的 32 位整数。
一个 ASCII 字符串,可能包含 NULL 字节。(实际上,由于 XML 的底层特性,一些 XML-RPC 实现支持 Unicode。)
真或假。
一个双精度浮点数。(在某些实现中,精度可能受到限制。)
日期和时间。不幸的是,由于 XML-RPC 禁止使用时区,这几乎是无用的。
任意长度的原始二进制数据;在网络传输中使用 Base64 编码。非常有用。(尽管有些实现不喜欢接收零字节的数据。)
一个一维的值数组。单个值可以是任何类型。
键值对的集合。键是字符串;值可以是任何类型。
XML-RPC 的灵感来自两个早期的协议。第一个是 Dave Winer 设计的匿名 RPC 协议,并在 一篇旧的 DaveNet 文章中宣布。(这就是为什么 XML-RPC 服务器通常安装在/RPC2。)另一个更重要的灵感是 SOAP 协议的早期草案。
Dave Winer 慷慨地提供了一个更长的 XML-RPC 历史。这也解释了 XML-RPC 和 SOAP 之间的关系。