2002-08-21 09:40
SOAP与RDF
--超越远程过程调用
Uche Ogbuji(
本文研究了 SOAP 可以用来传递 RDF 模型中的信息的方式。它讨论了为了便于进行像 PC 这样的交换,或者直接以
RDF/XML 序列化形式传输这个模型的部分数据,将 RDF 模型中的基本数据转换成 SOAP 编码的方法。
SOAP
是用来在较低层的因特网协议之上运载 XML 有效负载的传输协议。早于 1.2 版本的传输规范内建在所建议的 XML
编码中,这是为了适应编程语言构造的序列化。这样的编码是被称为远程过程调用(RPC)系统的主要部分,它们有一个共同的目标,就是使对远程计算机发出的请求看起来象是本地过程调用一样。RPC
编码的其它示例是源自“典型”RPC(在 RFC 1014 中定义)的“外部数据表示”(External Data
Representation(XDR))以及源自 CORBA 的“通用数据表示”(Common Data
Representation(CDR))。作为以这种关系捆绑编码的结果,SOAP
表现出勿庸置疑的应用程序编程的能力,但是它的用途对于通用的数据交换似乎值得怀疑。
这些早期的对 SOAP 的偏爱引发了众多的争论。首先,混合传输和数据编码规范似乎是非常杂乱的通信方法,并且似乎公然违背实行几十年的网络互联的分层协议。毕竟,HTML 标记的规范没有嵌入到 HTTP 规范中。其次,选择将像 RPC 这样的编码放在突出的地位使 SOAP 处于比较尴尬的境地;它几乎不比以前的 XML RPC 机制更有表现力,然而由于 XML 的冗长以及 HTTP、SMTP 等这样的更一般的体系架构,它实际上只能保证更小的有效性。作为下一代 RPC,SOAP 带来的唯一好处似乎只是统一了 Microsoft 和 CORBA 阵营;这是很重要的,但是这当然不是说 SOAP 看起来很有前途。
SOAP-as-RPC 的一个重要的负面后果是,这样的系统一般来说完全不适合 Web 服务的下一代 EDI 的长远目标。如果 Web 服务成为网络上商业通信新的方法,那么它们似乎将需要在商业和合法请求级别上进行通信的传输机制,而不是在编程语言 API 级别上进行通信的传输机制。可以确信的是,和其它几个具有影响力的组织使用 SOAP 一样,ebXML 倡议(其长远目标是使用 XML 来打造用于国际电子商务通信的系统)最初拒绝使用 SOAP。
从那以后事情有所平息。SOAP 1.2 一定程度上减少了对特殊编码的依赖(将其归入单独的“附件”这部分),现在大多数开发者都在使用 SOAP,包括 ebXML。大多数 SOAP 实现仍然专门使用特殊的 SOAP 编码,但是有迹象表明事态将更开放,由于插件体系结构的缘故将有更广泛的编码选择,能够解决更多的通信问题。这样的一个问题是元数据的交换,包括帮助确定在其它 XML 文档(使用 SOAP 传输)中用到的语义的元数据。
“资源描述框架”(Resource Description Framework(RDF))是一个建模系统,该系统具有解决这种元数据交换的一些功能。本文将看看怎样一起使用 RDF 和 SOAP 来编码这种元数据,而且要看看在不需要转换成 SOAP 编码的情况下,怎样直接传输以 RDF 编码的数据实例。本文要求对 SOAP 和 RDF 比较熟悉。请参阅参考资料以获取关于这些主题的更多信息。另请参阅 IBM developerWorks XML 专区的 Thinking XML 专栏,以了解正在进行的与知识管理相关的 RDF 和其它 XML 技术的讨论。
好载体 RDF
首先,我将说明如果借助 SOAP 将 RDF
从一个系统传到另一个系统,您能做些什么。我将以 XML 专区(请参阅参考资料)上我的 Thinking XML
专栏中的一个正在讨论的问题跟踪器工程作为示例。假设我们希望交换添加到通往远程主机的系统的问题的详细信息。这可能是分散、分布式问题跟踪器的基础。RDF
序列化中,一个问题的示例如清单 1 所示。
清单 1:RDF/XML 序列化
xmlns:dc="http://purl.org/dc/elements/1.1#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xml:base="http://rdfinference.org/versa/issues">
In particular the question of how to convert numeric
types to resources
and vice versa require much thought.
这是一个由 Web 资源引起的示例问题。问题本身由 URI http://rdfinference.org/versa/issues#0101 标识。这个 URI 通过取文档的基本 URI,再在代表该问题的这个类型节点添加 rdf:ID 属性所给的片断来确定。使用 xml:base 属性给出文档的基本 URI(或者更精确地说,是文档元素的基本 URI,因此是类型节点元素本身的基本 URI),为 http://rdfinference.org/versa/issues。然后,您要写几个关于问题本身的语句,最重要的是,使用 Dublin Core 的 dc:relation 元数据标记给出问题引用的资源。您还要提供一个标识符(该标识符是问题完整的 URI 的缩写,只是为了友好显示这个问题)、问题的创建者、提交日期、简要标题以及详细描述。
请记住这是 RDF,因此 XML 序列化不是最重要的事,最重要的事是这个示例问题怎样转换为抽象的 RDF 模型。例如,图 1,由 Triclops(一个 RDF 可视化工具,随 4Suite 0.12.0 alpha 1 或更近的版本提供)生成(警告:这个工具生成相当大的一张图)。您还可以使用 Dan Brickley 的在线 RDF 可视化程序生成一个类似的图。
图 1:样本 RDF 模型的图解
现在我来看看在 SOAP 消息中传输这种模型的两种方式:第一种是通过转换为 SOAP 编码来传输,另一种是直接以 RDF
编码来传输。
使用 SOAP 编码
首先,您必须计划传输的方法。您所定义的 RDF
是数据束,其思想是将这个数据束放在消息中传输,您按照我们期望接收方处理数据的方式来命名。在本例中,您通知远程服务器:这里有一个新的问题要跟踪。因此,我把这个方法叫做
newIssue。请注意,由于现在您正在使用 SOAP 编码,所以您也可能使方法名适合于带有用于 RPC 的 SOAP 绑定的编程语言。
然后,您不得不找到传输这个新问题对象的方法。您通过传输这个新对象的标识及它的属性来完成。本质上是,您将新问题对象的每个属性去掉,并且将其转换成消息参数。因为 SOAP 编码很注重类型信息,所以您必须用一个类型修饰每个参数(请参阅清单 2)。
清单 2:newIssue SOAP 消息
xmlns:itsoap="http://rdfinference.org/schemata/issue-tracker/soap"
xmlns:it="http://rdfinference.org/schemata/issue-tracker/"
xmlns:dc="http://purl.org/dc/elements/1.1#"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
make sense. In particular the
question of how to convert numeric types to
resources and vice versa require much
thought.
SOAP 编码规则要求,所有的值放在元素的内容中,这包括 RDF 中标记作为资源的值,因此给定了数据类型 anyURI。请注意,这允许这些值可以是 URI 引用,也可以是完整的 URI(也就是说,相对 URI 和片断都可以)。如果所有这样的消息都是这种格式,那么通过给消息元素定义一个 XML 模式定义,您可以避免必须重复数据类型,之后,它可以放在“Web 服务描述语言”(WSDL)元素中,或者以一些其它的非常规方式进行通信。清单 3 和清单 4 是这种模式的片断(省略了根元素和名称空间声明)(分别给出是因为它们占用不同的目标名称空间)。
清单 3:newIssue SOAP 消息元素的模式片断
清单 4:newIssue SOAP 消息参数元素的模式片断
可以将这些片断简化为清单 5。
清单 5:没有内联类型装饰的 newIssue SOAP 消息
xmlns:itsoap="http://rdfinference.org/schemata/issue-tracker/soap"
xmlns:it="http://rdfinference.org/schemata/issue-tracker/"
xmlns:dc="http://purl.org/dc/elements/1.1#"
>
In particular the question of how to convert numeric
types to resources
and vice versa require much
thought.
发送原始 RDF
我在本文开始部分讨论过,没有理由为了使用 SOAP,而一定将
SOAP 消息转换为 RPC 形式。如果您不是一定需要将 RPC
集成到其它系统中,那么在恰当的时候,您可以采用更自然的措施,使用发送数据并且使远程系统可以自由处理数据的声明性方法。还没有官方的面向 SOAP 的 RDF
编码,而本文的讨论基于 RDF 和 SOAP 的约定和规定。
最简单的方法是仅仅使 rdf:RDF 元素作为 SOAP 体的单个顶层元素,说明见清单 6。
清单 6:
xmlns:it="http://rdfinference.org/schemata/issue-tracker/"
xmlns:dc="http://purl.org/dc/elements/1.1#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
>
In particular the question of how to convert numeric
types to resources
and vice versa require much thought.
所用的编码标识,http://rdfinference.org/rdfws/soap-encoding 是非规范化的,其本质是,直接将 RDF/XML 的嵌入部分编码到 SOAP 消息体中。消息形式和一般形式的一个关键的区别是,rdf:about 用来识别问题资源,但是,它没有内联地使用标识来声明。这是序列化用于 SOAP 传输的 RDF 模型的一个很重要的原则:避免内联声明。假如我们可以使用 xml:base 修改标识的基本位置,那么这样的原则看起来并不是必需的,但是很难想象出内联传输的资源的生命周期和所有权的清晰语义。请注意,内联声明并非在所有的情况下都能避免。例如,匿名资源(也就是空节点)可能需要作为描述的一部分被传输,根据定义,它们没有恰当的标识符。
结束语
当谈到 SOAP 和 RDF
怎样能够进行互操作时,还有其它的方法和思想,事实上这是人们一直很感兴趣的主题,RDF 用户怎样发现 Web 服务以及 Web 服务怎样找到 RDF
用户。在参考资料这一部分提供了对于该讨论所涉及的内容。更通用的用于序列化基于 XML 数据的系统当然会使全世界的 Web 服务更丰富。
请单击文章顶部和底部的讨论按钮参加关于这篇文章的讨论论坛。
Uche Ogbuji 写的 Introduction to RDF,提供了对 RDF 的基本介绍,并且包括到其它有用参考资料的链接。
Dublin Core metadata initiative 保存有描述 Web 上类似库的元数据的词汇表。
Graham Glass 所著的 The Web services (r)evolution, Part 3: How SOAP Works,对 SOAP(更老的变体)有深入的见解。
SOAP Version 1.2 Part 0: Primer,W3C 的一个关于 SOAP 的工作草案。这是对 SOAP 1.2 的优秀介绍。
Uche Ogbuji 的 Thinking XML 专栏。
Henrik Frystyk Nielsen 所著的怎样可以用 SOAP 序列化 RDF 模型的示例。
4Suite,Uche Ogbuji 参与开发的一组 XML 和 RDF 工具。
如果在 Web 上已经可以序列化 XML,Dan Brickley 的 RDF
可视化程序是生成 RDF 图的很方便的工具。
|