IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  SOA and Web services  >

SOAP与 RDF

超越远程过程调用

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 初级

Uche Ogbuji (uche.ogbuji@fourthought.com), 首席顾问, Fourthought, Inc

2002 年 2 月 01 日

本文研究了 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 序列化
<?xml version="1.0"?>
<rdf:RDF 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#"
         xml:base="http://rdfinference.org/versa/issues">
  <it:issue rdf:ID="0101">
    <dc:relation rdf:resource="http://rdfinference.org/versa/0/2"/>
    <dc:identifier>0101</dc:identifier>
    <dc:creator rdf:resource="mailto:uche.ogbuji@fourthought.com"/>
    <dc:date>2002-01-27</dc:date>
    <dc:title>Data type conversions</dc:title>
    <dc:description>Not all the data type conversions listed make sense.  
    In particular the question of how to convert numeric types to resources 
    and vice versa require much thought.</dc:description>
  </it:issue>
</rdf:RDF>

这是一个由 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 模型的图解
图 1:样本 RDF 模型的图解

现在我来看看在 SOAP 消息中传输这种模型的两种方式:第一种是通过转换为 SOAP 编码来传输,另一种是直接以 RDF 编码来传输。

使用 SOAP 编码

首先,您必须计划传输的方法。您所定义的 RDF 是数据束,其思想是将这个数据束放在消息中传输,您按照我们期望接收方处理数据的方式来命名。在本例中,您通知远程服务器:这里有一个新的问题要跟踪。因此,我把这个方法叫做 newIssue 。请注意,由于现在您正在使用 SOAP 编码,所以您也可能使方法名适合于带有用于 RPC 的 SOAP 绑定的编程语言。

然后,您不得不找到传输这个新问题对象的方法。您通过传输这个新对象的标识及它的属性来完成。本质上是,您将新问题对象的每个属性去掉,并且将其转换成消息参数。因为 SOAP 编码很注重类型信息,所以您必须用一个类型修饰每个参数(请参阅 清单 2)。


清单 2:newIssue SOAP 消息
<?xml version='1.0' ?>
<env:Envelope xmlns:env="http://www.w3.org/2001/12/soap-envelope">
 <env:Body>
   <itsoap:newIssue 
     env:encodingStyle="http://www.w3.org/2001/12/soap-encoding"
     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">
     <dc:identifier xsi:type="xs:nonNegativeInteger">0101</dc:identifier>
     <dc:relation xsi:type="xs:anyURI">http://rdfinference.org/versa/0/2</dc:relation>
     <dc:creator xsi:type="xs:anyURI">mailto:uche.ogbuji@fourthought.com</dc:creator>
     <dc:date xsi:type="xs:date">2002-01-27</dc:date>
     <dc:title xsi:type="xs:string">Data type conversions</dc:title>
     <dc:description xsi:type="xs:string">Not all the data type conversions listed 
    make sense.     In particular the question of how to convert numeric types to 
    resources and vice versa require much thought.</dc:description>
   </itsoap:newIssue >
 </env:Body>
</env:Envelope>

SOAP 编码规则要求,所有的值放在元素的内容中,这包括 RDF 中标记作为资源的值,因此给定了数据类型 anyURI 。请注意,这允许这些值可以是 URI 引用,也可以是完整的 URI(也就是说,相对 URI 和片断都可以)。如果所有这样的消息都是这种格式,那么通过给消息元素定义一个 XML 模式定义,您可以避免必须重复数据类型,之后,它可以放在“Web 服务描述语言”(WSDL)元素中,或者以一些其它的非常规方式进行通信。 清单 3清单 4是这种模式的片断(省略了根元素和名称空间声明)(分别给出是因为它们占用不同的目标名称空间)。


清单 3:newIssue SOAP 消息元素的模式片断
<!-- with target namespace = http://rdfinference.org/schemata/issue-tracker/soap -->
<xsd:element name="newIssue">
  <xsd:complexType>
    <xsd:all>
      <xsd:element ref="dc:identifier"/>
      <xsd:element ref="dc:relation"/>
      <xsd:element ref="dc:creator"/>
      <xsd:element ref="dc:date"/>
      <xsd:element ref="dc:title"/>
      <xsd:element ref="dc:description"/>
    </xsd:all>
  </xsd:complexType>
</xsd:element>



清单 4:newIssue SOAP 消息参数元素的模式片断
<!-- with target namespace = http://purl.org/dc/elements/1.1# -->
<xsd:element name="identifier" type="xsd:nonNegativeInteger"/>
<xsd:element name="relation" type="xsd:anyURI"/>
<xsd:element name="creator" type="xsd:anyURI"/>
<xsd:element name="date" type="xsd:string"/>
<xsd:element name="title" type="xsd:string"/>
<xsd:element name="description" type="xsd:string"/>

可以将这些片断简化为 清单 5


清单 5:没有内联类型装饰的 newIssue SOAP 消息
<?xml version='1.0' ?>
<env:Envelope xmlns:env="http://www.w3.org/2001/12/soap-envelope">
 <env:Body>
   <itsoap:newIssue 
     env:encodingStyle="http://www.w3.org/2001/12/soap-encoding"
     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#"
   >
     <dc:identifier>0101</dc:identifier>
     <dc:relation>http://rdfinference.org/versa/0/2</dc:relation>
     <dc:creator>mailto:uche.ogbuji@fourthought.com</dc:creator>
     <dc:date>2002-01-27</dc:date>
     <dc:title>Data type conversions</dc:title>
     <dc:description>Not all the data type conversions listed make sense.  
    In particular the question of how to convert numeric types to resources 
    and vice versa require much thought.</dc:description>
   </itsoap:newIssue >
 </env:Body>
</env:Envelope>

发送原始 RDF

我在本文开始部分讨论过,没有理由为了使用 SOAP,而一定将 SOAP 消息转换为 RPC 形式。如果您不是一定需要将 RPC 集成到其它系统中,那么在恰当的时候,您可以采用更自然的措施,使用发送数据并且使远程系统可以自由处理数据的声明性方法。还没有官方的面向 SOAP 的 RDF 编码,而本文的讨论基于 RDF 和 SOAP 的约定和规定。

最简单的方法是仅仅使 rdf:RDF 元素作为 SOAP 体的单个顶层元素,说明见 清单 6


清单 6:
<env:Envelope xmlns:env="http://www.w3.org/2001/12/soap-envelope">
 <env:Body>
<rdf:RDF env:encodingStyle="http://rdfinference.org/rdfws/soap-encoding"
         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#"
>
  <it:issue rdf:about="http://rdfinference.org/versa/issues#0101">
    <dc:relation rdf:resource="http://rdfinference.org/versa/0/2"/>
    <dc:identifier>0101</dc:identifier>
    <dc:creator rdf:resource="mailto:uche.ogbuji@fourthought.com"/>
    <dc:date>2002-01-27</dc:date>
    <dc:title>Data type conversions</dc:title>
    <dc:description>Not all the data type conversions listed make sense.  
    In particular the question of how to convert numeric types to resources 
    and vice versa require much thought.</dc:description>
  </it:issue>
</rdf:RDF>
 </env:Body>
</env:Envelope>

所用的编码标识, http://rdfinference.org/rdfws/soap-encoding 是非规范化的,其本质是,直接将 RDF/XML 的嵌入部分编码到 SOAP 消息体中。消息形式和一般形式的一个关键的区别是, rdf:about 用来识别问题资源,但是,它没有内联地使用标识来声明。这是序列化用于 SOAP 传输的 RDF 模型的一个很重要的原则:避免内联声明。假如我们可以使用 xml:base 修改标识的基本位置,那么这样的原则看起来并不是必需的,但是很难想象出内联传输的资源的生命周期和所有权的清晰语义。请注意,内联声明并非在所有的情况下都能避免。例如,匿名资源(也就是空节点)可能需要作为描述的一部分被传输,根据定义,它们没有恰当的标识符。





回页首


结束语

当谈到 SOAP 和 RDF 怎样能够进行互操作时,还有其它的方法和思想,事实上这是人们一直很感兴趣的主题,RDF 用户怎样发现 Web 服务以及 Web 服务怎样找到 RDF 用户。在 参考资料这一部分提供了对于该讨论所涉及的内容。更通用的用于序列化基于 XML 数据的系统当然会使全世界的 Web 服务更丰富。



参考资料

RDF 和 Web 服务之间相互影响的讨论 工具等内容
  • 4Suite,Uche Ogbuji 参与开发的一组 XML 和 RDF 工具。

  • 如果在 Web 上已经可以序列化 XML,Dan Brickley 的 RDF 可视化程序是生成 RDF 图的很方便的工具。


关于作者

Uche Ogbuji 的相片

Uche Ogbuji 是 Fourthought, Inc的顾问兼联合创始人,该公司是专为企业知识管理应用提供 XML 解决方案的软件供应商和咨询公司。Fourthought 开发了 4Suite,它是 XML 中间件的开放源码平台。Ogbuji 先生是一名出生于尼日利亚的计算机工程师和作家,他在美国科罗拉多州的博耳德生活和工作。您可以通过 uche.ogbuji@fourthought.com与 Ogbuji 先生联系。




对本文的评价










回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款