跳转到内容

XML - 管理数据交换/RPC

来自维基教科书,开放书籍,开放世界



上一章 下一章
WDDX JSTL



作者:Nathan Slider
编辑:Nathan Slider
UGA 互联网技术硕士课程, 2005

学习目标

[编辑 | 编辑源代码]

完成本章后,您将能够

  • 讨论 XML-RPC
  • 根据示例创建 XML-RPC 代码

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 (可扩展标记语言远程过程调用) 是一种用 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>

参考文献

[编辑 | 编辑源代码]
华夏公益教科书