位置:海鸟网 > IT > XML >

详解XML-RPC和JAX-RPC

响应也是简单的XML文件,拥有根元素,或者有或者没有子元素。这与复杂的SOAP相应对比鲜明。

原先的XML-RPC协议是由Web先锋Dave Winer于1998年在UserLand Software公司发明的。其第一个实现是在UserLand Frontier开发平台上(事实上,UserLand Software的商标就是"XML-RPC")。“在HTTP之上传输XML文本”方法的自然用途就是创建SOAP,这其中有Winer, Don Box以及其他微软公司人士的贡献。但是,SOAP由于很多对应用完全不必要得特性而变得非常重量级,所以XML-RPC还是值得注意的。

原先的XML-RPC只使用一些数据类型,并不需要名字空间。通过定义和包含其它值的类型,它获得了相当可观的灵活性。下面是一个XML-RPC说明书中的例子。它指定了示例应用程序中"getStateName"方法的输入参数。

以下为引用的内容:
<?xml version="1.0"?>
<methodCall>
  <methodName>examples.getStateName
  <params>
    <param>41
  </params>
</methodCall>

你可能已经猜到这个标签表示4字节整数,下面是用于在标签中指定如何翻译内容的所有类型标签。如果没有使用任何标签,就认为是String值。注意,参数并没有被命名,元素的顺序只和方法参数的顺序一样。

以下为引用的内容:
Java Type  XML tag      Description
Integer   or    A 32 bit signed integer
Double        A double precision (64bit) signed floating point number
Boolean       0 (false) or 1 (true)
String        string
Date or   A timestamp in the ISO8601 style but simplified
Calendar            with resolution to the second.
byte[]        A base-64 encoded array of bytes
Map          Pair(s) of tags where the name is a string and
                the value can be any other type, including
Object[]        An array of objects where the elements can be any other type.


在原始的说明书中,没有办法指明任何类型的“null”值,但扩展版本允许附加类型。

响应也是简单的XML文件,拥有根元素,或者有或者没有子元素。这与复杂的SOAP相应对比鲜明。

XML-RPC实现

xmlrpc.com上列出的实现给出了通往79个不同实现的链接,它们在各种语言中实现了基本的XML-RPC协议,包括5个2003年12月用Java语言实现的。但是,这些项目中很多都是停滞的。而由Apache Web Services Project主持的项目则是活跃的。我尝试运行当前的3.0a1版本,却发现它对其它Web服务项目库有奇怪的依赖。看起来似乎Apache Web Services Project在开发3版本,所以如果你对开源XML-RPC解决方案感兴趣,不妨对它多关注。

JAX-RPC: 针对XML RPC的Java API

最早的Java API要从JSR 101开始算起。这项工作从2001年初开始,到2002年年中到达1.0版本。2003年,发布了1.1版本并附带在Java Web Services Developer Pack由Sun的参考实现。在JAX-RPC中,Java原始类型的定义与XML schema类型紧密相关。它还支持更多的Java标准库对象,例如,BigInteger 和 BigDecimal,以及符合JavaBeans标准的对象。使用JSR 101的人可以并行开发SOAP和其它XML技术。

Java Web Services Developer Pack (JWSDP)1.6版包括很多其它东西以及对JAX-RPC 1.1.3的一个实现。

JAX-WS 2.0:下一个JAX-RPC

该说明书的下一个版本叫做JAX-WS 2.0,是针对基于XML的Web服务,用来代替JAX-RPC的Java API。该标准被作为Java Specification Request (JSR) 224来开发,现在处于最后草案阶段。

JAX-RPC的下一个版本将显著降低Web服务开发的复杂性,部分通过使用Java 1.5标准库的特性来实现。你可以跟踪网站上源码列表中的参考实现。至于本文,已经可以访问第3版的参考实现。

使用JWSDP 1.6

JWSDP 1.6一个有用的功能就是对Web Services Description Language (WSDL)的支持。假定有一个描述Web服务的WSDL文档,那么就可以自动生成访问服务的客户端代码和支持服务的服务器端代码。为了用一个简单的接口用来相应客户对已发布的Web服务的请求,我在JWSDP 1.6中用wscompile工具创建客户端的类,它们可以基于三四个输入参数来描述可能的动作。结果,几秒钟内就能创建惊人的32个类。

一旦我指出这些类中的哪些提供真正的创建请求的起始点,那么编写代码实现简单的命令行接口就很简单了。而当我想运行程序时,问题随之而来。客户端需要从JWSDP中添加10个jar包到他自己的Java程序中。

由于不能帮大家一个一个调试这些jar包与其它Java程序的潜在冲突,我放弃这种做法,转而用string模板写一个简单的程序来创建SOAP请求和XPath来翻译返回的结果。就像其名字一样,我认为JWSDP将主要用于创建Web服务,而不是消费Web服务。

XML-RPC还有用吗?

JAX-RPC的复杂性导致程序员的某种倒退。从Google中搜索"JAX-RPC complexity"就能看到一些用户的反应。我想你应该在以下情况考虑XML-RPC而不是JAX-RPC:

你的应用程序只需相对简单的请求

你能控制服务器端和客户端,你不需要发布WSDL

你想简单的解析客户端(就像AJAX应用程序)