XML - 管理数据交换/RPC
上一章 | 下一章 |
← WDDX | JSTL → |
作者:Nathan Slider
编辑:Nathan Slider
UGA 互联网技术硕士课程, 2005
完成本章后,您将能够
- 讨论 XML-RPC
- 根据示例创建 XML-RPC 代码
为了完全理解 XML-RPC,我们应该首先定义 RPC。远程过程调用 (RPC) 是一种协议,允许一台主机上运行的计算机程序在无需程序员显式编码的情况下,在另一台主机上执行代码。RPC 由调用者(客户端)向远程系统(服务器)发送请求消息来启动,该请求消息使用提供的参数来执行某个过程。结果消息将返回给调用者。各种实现中存在许多变体和细微差别,导致各种不同的(不兼容的)RPC 协议。
为了允许服务器被不同的客户端访问,已经创建了许多标准化的 RPC 系统。其中大多数使用接口描述语言 (IDL) 来允许各种平台调用 RPC。Web 服务是跨平台实现 RPC 的首次真正尝试。使用 Web 服务,.NET 客户端可以调用在 Unix 服务器上用 Java 实现的远程过程(反之亦然)。
Web 服务使用 XML 作为 IDL,并使用 HTTP 作为网络协议。此系统的优点是简单性和标准化,IDL 是一个广泛理解的文本文件,而 HTTP 内置在几乎所有现代操作系统中。XML-RPC 就是这种 RPC 系统的一个例子。
XML-RPC (可扩展标记语言远程过程调用) 是一种用 XML 编码的远程过程调用协议。这是一个非常简单的协议,只定义了少量的数据类型和命令,整个描述可以在两页纸上打印出来。这与大多数 RPC 系统形成鲜明对比,在大多数 RPC 系统中,标准文档通常有数千页,需要大量的软件支持才能使用。
它最初由 Dave Winer 于 1995 年与 微软 共同创建。但是,微软认为它过于简单,开始添加功能。经过几轮这种操作后,该标准不再那么简单,变成了现在的 SOAP。
"我们想要一个简洁、可扩展的格式,非常简单。HTML 编码人员应该能够查看包含 XML-RPC 过程调用的文件,理解其作用,并能够修改它,并使其在一两次尝试中就能运行... 我们还想让它成为一个易于实现的协议,可以快速适应在其他环境或其他操作系统上运行。"-xmlrpc.com
引用自 XML-RPC 的数据类型
名称 | 标签示例 | 描述 |
---|---|---|
数组 |
<array>
<data>
<value><i4>1404</i4></value>
<value><string>Something Here</string></value>
<value><i4>1</i4></value>
</data>
</array>
|
值数组,不存储键 |
base64 | <base64>eW91IGNhbid0IHJlYWQgdGhpcyE=</base64> | [Base 64] 编码的二进制数据 |
布尔值 | <boolean>1</boolean> | [布尔值] 逻辑值(0 或 1) |
日期/时间 | <dateTime.iso8601>19980717T14:08:55</dateTime.iso8601> | 日期和时间 |
双精度 | <double>-12.53</double> | 双精度 [精度] 浮点数 |
整数 | <i4>42</i4> | 整数,[整数] |
字符串 | <string>Hello world!</string> | 字符的字符串。必须遵循 XML 编码。 |
结构 |
<struct>
<member>
<name>foo</name>
<value><i4>1</i4></value>
</member>
<member>
<name>bar</name>
<value><i4>2</i4></value>
</member>
</struct>
|
值数组,存储键 |
空 | <nil/> | 判别空值;一个 XML-RPC 扩展 |
典型的 XML-RPC 请求示例如下所示
<?xml version="1.0"?>
<methodCall>
<methodName>examples.getStateName</methodName>
<params>
<param>
<value><i4>41</i4></value>
</param>
</params>
</methodCall>
典型的 XML-RPC 响应示例如下所示
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value><string>South Dakota</string></value>
</param>
</params>
</methodResponse>
典型的 XML-RPC 错误示例如下所示
<?xml version="1.0"?>
<methodResponse>
<fault>
<value>
<struct>
<member>
<name>faultCode</name>
<value><int>4</int></value>
</member>
<member>
<name>faultString</name>
<value><string>Too many parameters.</string></value>
</member>
</struct>
</value>
</fault>
</methodResponse>
最后一个示例,将 PHP 关联数组与等效的 XML-RPC <struct> 进行比较。此数组
Array
(
[0] => 'dogs',
[1] => 'cats',
['animals'] => Array(
[0] => FALSE,
[1] => 'little_dogs',
[2] => 'little_cats',
[3] => 5,
[4] => 2.3,
[5] => 1,
),
);
变为以下 XML-RPC
<?xml version="1.0" encoding="utf-8"?>
<methodResponse>
<params>
<param>
<value>
<struct>
<member>
<name>0
</name>
<value><string>dogs</string>
</value>
</member>
<member>
<name>1
</name>
<value><string>cats</string>
</value>
</member>
<member>
<name>animals
</name>
<value>
<array>
<data>
<value><boolean>0</boolean>
</value>
<value><string>little_dogs</string>
</value>
<value><string>little_cats</string>
</value>
<value><i4>5</i4>
</value>
<value><double>2.3</double>
</value>
<value><boolean>1</boolean>
</value>
</data>
</array>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodResponse>