Java 编程中的 XML-RPC(一)

标题:Java 编程中的 XML-RPC(一)


时间: 2004-12-31

来源:IBM DW 作者:Roy Miller

  应用程序间通信对程序员来说可能是个不好对付的问题。而许多可用的选择(如 JNI)又难于掌握。XML-RPC 提供了一种非常简单的解决方案。该方法简洁、易于实现,且得到了大多数流行编程语言(例如 Java 语言和 C++)的开放源代码库的良好支持。例如,如果您有一个 Java 应用程序需要与另一个用 C++ 编写的应用程序进行对话,那么 XML-RPC 正好可能是最简单的方法。在本文中,软件开发人员兼培训师 Roy Miller 谈论了 XML-RPC 是什么以及如何有效地使用它。

  我无数次从开发同伴那里听说最新的热门技术就是对软件开发世界中使人烦恼的问题的解决方法。XML 首次出现时,许多人就是这样说的。此时,我没有感到兴奋,而且从那时起,我的态度也没有太多改变。我一直认为 XML 是种极佳的方法,用以定义结构化数据,而无需笨拙地将之转化为关系型结构。但是,XML 不是一种编程语言 —— XLST 在语法上较为复杂,且至少对于我来说有点奇怪。因此,我一直在等待出现需要进行结构化数据交换的问题,而这才是创造 XML 的真正目的。在最近的项目中就出现了这个特殊问题,XML(用作 XML-RPC)正是合适于该工作的工具。

  编程挑战

  我们的客户制造了一种硬件设备。我们加入该项目之前,用户配置每台设备的惟一方法就是用命令行接口。要不是每个客户在每个网络上可能有 20 台或更多(也许甚至成百或上千)这样的硬件设备,该方法也并非必定糟糕。迫使客户用命令行接口一个接一个地配置每台设备很可能会削减销售。当客户在订货到达后不得不对多台设备进行初始设置和配置的时候,该问题将会更为尖锐。每个设备的配置包含在一个 XML 文件中,而设备在启动时将读取该文件。

  客户聘请我们创建一个配置应用程序,用以在一个或更多位置集中的管理机器上运行。该应用程序需要简化所有设备的初始设置,将之重新配置为要进行固件升级、纠正错误等等,以及监控现有设备。其中有点困难的问题就是设备上的软件是用 C 编写的,而我们的台式机应用程序却需要用 Java 编程语言进行编写。我们首先考虑的是 JNI,但是觉得应该存在更简单的东西。那就是称作 XML-RPC 的有用的小东西。

  XML-RPC 入门
  XML-RPC 网站是这样描述的:
  它是允许运行在不同操作系统、不同环境中的软件进行基于 Internet 过程调用的规范和一组实现。这种远程过程调用使用 HTTP 作为传输协议,XML 作为编码格式。XML-RPC 的定义尽可能简单,但能够传送、处理和返回复杂的数据结构。

  在阅读该描述时,我们就知道我们有了答案。每台设备的配置保存在一个文件之中(其内容也是 XML,但这对于该论述无关紧要)。这意味着我们已经拥有告诉每台设备如何配置自身的语义。如果我们给设备发送它所期待的配置文件,那就会很好了。但是将如何发送呢?我们可以仅仅发送字节,但那样会危及安全性,况且用字节操作来完成这一切也不是谁所真正需要的。我们意识到可以用定义良好的 XML-RPC 消息来发送字符串有效负荷,而 XML-RPC 消息将允许我们调用每台设备上严格限制的软件公共接口中的 C 函数。

  XML-RPC 重点
  概括地说,您可以将 XML-RPC 认为是简化的 SOAP。它可能是您曾需要的惟一的应用程序间的通信。XML-RPC 网站上有个极佳的“入门”文档,该网站还提供了一些发展历史以及各种语言的实例。但是,您可能只需要阅读其规范。在不到六页的内容上包括了一个简单的模型。本节中,我们将介绍一些重点,以便为如何在项目中使用 XML-RPC 做好准备。

  一个 XML-RPC 消息就是一个请求体为 XML 的 HTTP-POST 请求。您需要一个 XML-RPC 客户程序来创建消息,以及一个 XML-RPC 服务程序来接收消息。服务程序一旦完成了请求,就同样以 XML 格式送回一个 XML-RPC 响应消息。请求可以包含参数(整数、字符串、日期以及其他类型,如果需要还可以包括数组和复杂记录)。每个请求的格式都极其简单,如清单 1 所示:
清单 1. XML-RPC 请求示例
POST /RPC2 HTTP/1.0
User-Agent: Frontier/5.1.2 (WinNT)
Host: betty.userland.com
Content-Type: text/xml
Content-length: 181

<?xml version="1.0"?>
<methodCall>
<methodName>examples.getStateName</methodName>
<params>
<param>
<value><i4>41</i4></value>
</param>
</params>
</methodCall>

 

  您需要一个指定“处理程序”名(清单 1 中为 examples)的字符串 methodName 和一个调用该处理程序的方法(清单 1 中为 getStateName )。无论如何,服务程序可以解释这个名字字串。我们所使用的 Java 服务程序(我们将稍候讨论)将用处理程序名 examples 找到一个对象,并且调用该对象之上的 getStateName 方法。其响应也很简单,如清单 2 所示:
清单 2. XML-RPC 响应示例
HTTP/1.1 200 OK
Connection: close
Content-Length: 158
Content-Type: text/xml
Date: Fri, 17 Jul 1998 19:55:08 GMT
Server: UserLand Frontier/5.1.2-WinNT

<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value><string>South Dakota</string></value>
</param>
</params>
</methodResponse>


  当您发出一个 XML-RPC 调用时,您将获得一个 XML 响应,其中包含一个 元素,该元素中又依次包含一个 元素,其中再包含一个元素,该元素中则包含一个需要进行处理的返回值。大多数情况下,这就是您所希望获得的响应。但是现实从来都不是那么简单的。如果发生某些错误,服务程序则会返回“故障”响应,如清单 3(反映在 RPC 中发送太多参数的故障)所示:
清单 3. XML-RPC 故障响应示例
HTTP/1.1 200 OK
Connection: close
Content-Length: 426
Content-Type: text/xml
Date: Fri, 17 Jul 1998 19:55:02 GMT
Server: UserLand Frontier/5.1.2-WinNT


<?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>


  元素的 元素中包含一个带有 faultCode member 成员和 成员的结构。这就像是 Java 类中的 toString()。如果发生错误,并且是由编码所致,toString() 则会通过错误代码和出错消息告诉您是什么。而 XML-RPC 故障响应完成同样的工作。

  这也涉及您需要用以理解 XML-RPC 相关处理的所有内容。实际上,您真的无需了解 XML 消息布局的细节。只要提供了有效输入,您所选择的 XML-RPC 实现库将为您完成所有工作。因此,您所缺乏的用以读取规范的惟一工具就是客户程序和服务程序实现。在这个应用程序中,我们需要 Java 实现的客户程序和 C 实现的服务程序。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值