在电影fight club(战争俱乐部)中brad pitt和edward norton是一对密友??心理上对立的两个极端??两个小伙子尝试互相 通信但十分艰难令人感兴趣的是??没有给出提示台词??影片中 的大部分剧情都围绕着肥皂的生产进行看上去像是把多个角色以独一 无二的令人意想不到的方式绑在了一起 现在快进到一种不同类型的剧情microsoft和sun这两个软件密友 在internet也出演了这段剧情他们每一方都用经过良好定义的视点 试图弥合彼此间的差异并与另一方之间建立一条通信线路进入soap 即简单对象访问协议 简介SOAP简单地讲就是允许Java对象和COM对象在分布式分散的 基于Web的环境中彼此通话更一般地讲SOAP允许任何类型的对象(或 代码)??在任何平台上以任何一种语言??相互通信目前已在 多个平台上以多种语言实现了SOAP突然之间任何地方的对象 无论本地或远程的无论大或小都可以互操作Brad Pitt和Edward Norton就像两种截然不同的对象最终能够通信 回顾一下这种技术我最开始将在web服务的大环境下介绍soap soap作为一种协议它与uddi(通用描述发现和集成)一起提供了业 务间注册和消息传递服务我还将讨论揭示发布查找绑定范例的 基于web的基础并介绍soap包装传输和发送机制 web服务的发展先把所有大肆张扬的宣传放在一边SOAP仅仅只是一种组件??虽然 是一种中心组件??用于把Web的蓝图描述成用于业务操作的基于标准 的语言与平台中性的架构这些业务操作通常被标上了Web 服务 的通用标签但是Web服务自身也只是一种支持它们的良好的基础相应 地Internet有一种快捷的n层基础 网络分层在Web服务的发展过程中有种网络层是显而易见的TCP/IP HTTP/HTML和XML现在这个层相继构建在彼此的顶上并保持相互之间 的兼容性 第层tcp/ip协议主要关注的是以分组形式通过线缆传输数据 作为一种确保通过公共网络传输的协议tcp/ip强调数据传输的可靠性 和物理连通性起初是把专用网络粘合在一起现在则是用web中枢协议 来连接网络更高层次的标准协议如http就是依赖于这种中枢协议的 第层http上的html它是一个显示层自身关注的是基于浏览器 的搜索检索和信息共享它强调的是基于gui(图形用户界面)的导航 和显示格式的处理在许多方面html更多地是用于显示而不是转到 别的网页上并且在可扩展性和真正的编程能力上有所欠缺虽然如此 在浏览器环境中共享超文本链接的文档使人们用基于文本的信息与他人 通信的方式引发了革命网络桌面环境受专用操作系统和依赖于平台 的软件所限速度缓慢毫无疑问会让路于基于标准的对系统开放的 internet 把这种责任引导到这个勇敢的新的基于标准的世界的是xml它 是internet的第层也可能是最引人注目的一层xml一种强类型数 据交换格式它为http/html层提供了一个新范围在xml层中机器到 机器的通信有可能通过标准接口来进行xml层??有多种不同的描述 如aa(应用程序到应用程序)bb(业务到业务)或cc(计算机到 计算机)??允许程序在平台上交换数据格式??和显示??独立于编 程的方式xslt样式表可以作为一种可选用的显示和/或可传输的组件予 以添加 xml描述web服务的关键把这种可能变为现实的关键是实现机器到机器的通信这是XML力所 能及的作为一种描述数据的词法XML是定义驱动的(通过使用DTD和 架构)并允许以编程方式处理信息这意味着大多数可考虑到的工作 都可以从BB通信中取出来可以有一致的标记可以定义接口处理也 可以是标准化的Web服务是可重用的组件程序它们把XML用作一种标 准的可扩展的通信架构以方便机器到机器类型的通信 web服务为通过http传输的组件数据和业务逻辑提供接口大量的数 据被放置在服务器端脚本后面的一个传统的位置等待着被web浏览器或 客户程序访问web服务承诺使许多企业领域的处于闲置状态的公司软 件资源获得新生 在把驻留于web中的数据集成到企业应用程序中和协调用于组件片固 定的业务逻辑方面xml起了至关重要的作用特定的业务逻辑和服务 (包括工作流程逻辑业务逻辑组件序列逻辑交易逻辑等)可以封 装在xml文档中并集成到现有的业务环境中去这允许业务在内部资源 和web服务之间简化业务交易逻辑和通过web提供链条式交互之间起到 槓桿作用 由于xml是人们可阅读的和基于文本的使之可理想地用作传输松耦 合的web服务的架构最低限度是自动化的交易可提高生产率减少费 用和改善服务网络标准的存在使自动化交易成为可能使所有成员的 生产率都能得到提高 soap是一种源于更早的基于xml标准的技术早期xml标准在某种意义 是指一种称为 ebxml(电子商务xml)的显示标准ebxml具有一种依次进行的连续 逻辑它在贸易合作者间提供了一种共享业务消息的综合定义soap适用 的范围更普遍也更容易实现 松耦合的系统Web服务把对象从管理它们的平台上分离开来也就是说Web服务使 独立于平台的对象之间的交互更容易对象可以访问Web上任何地方的数 据作为脱离专用平台的一部分Web服务依赖于松散而不是紧密耦合的 Web组件根据Brian Travis(SOAP顾问和作者)的观点依赖于专用 对象的系统被认为是耦合紧密的因为它们依赖一种定义良好但很脆弱 的接口如果应用程序与服务对象间通信的任何部分被打断或者如果 调用不完全正确将会发生不可预料的结果EDI就是一个用于执行电 子商务的耦合紧密的架构的例子松耦合的系统允许在开放的分布式 Web环境中进行灵活的和动态的交换 corba第二次降临网络上的公司??IBMBEASun仅举几个例子??同时在与他们 竞争的公司合作标准化的网络传输协议独立于平台的编程语言如 JavaXML和特定行业的专业用语及开放的基于组件的服务器体系结构 使每个人都能免费享用非专用的资源现在Web服务带着其对包含广 泛的应用程序互操作性的承诺就像一种最终的胶水使这些技术 交互作用即使不是无缝的至少也不会超过以前技术如CORBA和RMI所 带来的累赘 在某种意义上web服务代表着corba的第二次降临但是corba是一 种面向对象的基于iiop的二进制通信架构是由基础骨架和特定于 供应商的orb装载而成的而web服务则是轻型的基于http的xml驱动 的及平台和语言完全中性的如果说corba是一只重达磅的大猩猩 那么web服务就是一只小羚羊在辽阔的internet禁区里自由地蹦跳 发布绑定和查找Web服务的架构由发布查找绑定这个周而复始的循环组成它通过 服务提供程序使数据内容和服务能为注册的服务请求者所用服务请 求者通过定位和绑定到服务来使用资源请求应用程序使用 WSDL(Web服务描述语言)把请求者转到Web服务上WSDL为想要的 服务提供了一种低层次的技术信息并授权访问关于数据编码的XML架构 信息及通过正确的协议确保调用正确的操作 发布绑定和查找机制在个独立(但有些等同)的协议中有它们 各自的副本这个协议是wsdlsoap和uddi(通用描述和发现接口) 它们组成了web服务网络栈 对corba作更深层次的类推可以发现soap起到了corba中iiop(或rmi 中的jrmp)的作用它是对立的端点间的绑定机制另一方面wsdl起 到了idl(接口描述语言)的作用在这种功能上wsdl把web服务定义 成端口和操作的集合wsdl端口是模拟接口的而wsdl操作则是模拟方 法的wsdl 把web服务接口发布给那些对跨越不同平台通信感兴趣的各 方 但是wsdl已经超越了一种接口定义语言它还包含允许给想发布的 web服务描述地址和协议信息的构造关于wsdl的令人感兴趣的事情是它 为web服务描述了一个抽象接口同时还允许您??以难以忍受的细节 ??绑定web服务给特定的传输机制如http通过使接口抽象化wsdl 可用作一种可重用的web服务技术通过绑定到特定的传输机制wsdl生 成了抽象的类聚如果这看上去有些自相矛盾可以想一下航天飞机 它是可重复使用的但要把全机能太空舱完全绑定到专用的但不可重 复使用的助力器火箭上传输机制可能会改变但有效载荷会保留下来 最后uddi是用于注册发布和查找web服务的在基于web的注册中 通过显示服务信息和绑定接口uddk为业务和客户提供了一个共享目录 以查找别人的web服务 构建web服务SOAP可通过远程调用对象上的方法让您构建应用程序SOAP消除 了两种系统必须运行于同一平台上且必须是用同一种编程语言编写而 成的要求SOAP包不是通过专用的二进制协议调用方法而是使用XML 这种基本文本的词法来调用方法请求应用程序与接收对象之间的所有 信息是作为XML流中的标记数据通过HTTP发送的从Web服务的角度来 看SOAP可以看作一种客户端或服务器实现 soap客户端和服务器SOAP客户端是一种创建XML文档的程序该XML文档包含在分布式系 统远程调用方法所需的信息SOAP客户端不是传统意义上的程序它除 了用作普通的桌面应用程序外还可以是一种Web服务器或基于服务器 的应用程序 来自soap客户端的消息和请求一般是通过http发送的因而soap 文档可以穿过几乎所有的防火墙从而能跨越不同的平台交换信息 soap服务器只是用于监听soap消息的特殊代码它可用作soap文档的 分配器和解释器外部web服务可以与基于jee技术的应用程序服务器交 互这种应用程序服务器可以处理多种客户端的soap请求 soap服务器确保通过http连接接收的文档被转换成可以被另一端对 象理解的语言由于所有的通信都采用xml格式某种语言(比如说 java)中的对象可以通过soap与另一种语言(如c++)中的对象通信 soap服务器的工作就是确保各端都能理解??并且满意??为它们提供 服务的soap soap和java技术根据SOAP 规范SOAP是一种用于在分散的分布式环境中交换 信息的轻型协议SOAP不会委托单一的编程模型??也不会为特定的 编程语言定义语言绑定在Java编程语言环境中它取决于Java团队来 定义特定的语言绑定现在Java语言绑定通过JAXRPC来集中定义 在最近的javaone开发人员讨论会上对soap的讨论中sun公司的工程 师roberto chinnici和rahul sharma把jax技术家庭的作用定义成使用 熟悉的用于java平台的jsp和ejb组件技术创建web服务servlets 和无状态会话bean被引用作两种最可能用于封装web服务的java技术 什么是soap?真的吗? 我们已经彻底设置好了SOAP舞台并描述了其在Web服务中至关重要的作用 现在进一步看看SOAP到底是什么它执行什么任务以及是怎样执行的? soap是一种可扩展的基于文本的架构它允许在不同角色之间通信这里的 角色一般是指对象它们先前并不了解对方或对方所在的平台从网络对象的角 度来看soap是它们的最后不可见形式客户端应用程序可以在松耦合的环境中 互操作以发现和动态地连接到服务而这并不需要事先在应用程序与服务之间 建立一种协定 soap是可扩展的这是因为无需中断已有的应用程序soap客户端服务器和 协议自身都能发展而且soap能极好地支持中间介质和层次化的体系结构这意 味着处理节点可以把请求的路径置于客户端与服务器之外中间节点通过使用报 头(用于标识哪个节点处理哪部分消息)来处理soap指定的各部分消息这种类 型的中间报头处理是通过客户端应用程序与中间处理节点之间的私人契约来执行 的soap为报头提供了一个mustunderstand属性它允许客户端将 处理指定为是必须执行的还是可选的如果mustunderstand被设置 为服务器必须执行报头指定的中间处理或给出错误 soap还定义了数据编码规则称为基准编码或section (第节)编码 它是出自soap规范中描述数据编码规则的那一节内容应当指出soap编码的内容 占了soap 规范页中的大部分篇幅不必深入到xml数据类型细节??它仍然 是xml架构制定组的专家们研究的范畴??soap编码可以简短地描述成简单值或复 合值的集合 简单值可以是简单类型如整型浮点型和字符型或者是xml架构规范第部 中定义的内置类型包括各种数据类型如字节型数组和枚举 复合值包括结构数组和xml架构制定组定义的复杂类型最后当然不是至 少soap数据编码指定了对象序列化规则即通过网络排列和分散数据流的机制 这些section 编码在任何情况下都不是强制性的注意这点很重要这样客 户端和服务器可以自由地使用不同的数据编码规范只要它们符合格式就行但 是这样做的话就会毁灭soap在网络上提供标准化服务所起的推动作用并且会 带来一个常见的警告已偏离航线太远单独的客户端和服务器可以选择较短的 旅行路线 最后soap建立了一组规则它允许客户端和服务器把soap用作一种通信架构 来执行远程过程调用soap??作为一种面向消息的协议??可以使用这些规范 像rpc类型的型一样良好地工作对象序列化的机制给soaprpc提供了活力 消息格式SOAP在标准化消息格式环境中可以做所有它能完成的工作消息的主体部分 是text/xml形式的MIME类型并且包含一个SOAP封套该封套是一个XML文 档封套包含了报头(可选的)和报文(必须有的)封套的报文部分总是用于 最终接收的消息而报头项目可以确定执行中间处理的目标节点附件二进制 数字及其他项目可以附加到报文上 soap提供了一种让客户端指定哪个中间处理节点必须处理报头项目的方法由 于报头与soap消息的主体内容是互不相关的所以可用它们给消息添加信息而 不会影响对消息报文的处理 例如报头可用于为报文中包含的请求提供数字签名在这种情形下身份验 证/授权服务器可以处理报头项目??独立于报文??可以剥离信息以验证签名 一旦通过验证封套的其余部分将被传递给soap服务器它将对消息的报文进行 处理深入研究一下soap封套有助于明了soap报头和报文元素的位置和用途 剖析soap封套SOAP 规范提供了下面的封套示例 <soapenv envelope xmlnsSOAPENV=SOAPENVencodingStyle=> <SOAPENVHeader> <tTransaction xmlnst=someURI> SOAPENVmustUnderstand= </tTransaction> </SOAPENVHeader> <SOAPENVBody> <mGetLastTradePrice xmlnsm=someURI> <symbol>DEF</Symbol> </m GetLastTradePrice> </SOAPENVBody> </SOAPEnvelope> 在这个例子中getlasttradeprice请求被传送给网络上某个位置的一个存储 引用服务该请求带有一个字符型参数一个订单符号并在soap响应中返回一 个浮点数 soap封套是表示soap消息的xml文档的顶层元素xml命名空间用于将soap标识 符与应用程序的特定标识符区分开xml命名空间在soap中使用很频繁以把消息 的元素的作用域限制在一个特定的领域理解soap命名空间有助于熟悉xml命名空 间规范如果您没有理解命名空间也可以简单地把它看作一种邻近的标识符 它通过把soap元素与特定的位置(真实的或想像的)相关联从而有助于惟一地 标识soap元素 命名空间上面例子中的第一个命名空间参照了在SOAP消息中定义元素和属性的SOAP模式 第二个命名空间参照了SOAP编码即前文中讨论过的Section 数据类型 由于没有指定额外的通用元素编码这种编码将适用于整篇文档 报头在SOAP封套报头示例中标识的第一个元素是一个transaction(交易)元素它 带有一个命名空间属性和一个值为的mustUnderstand 属性既然mustUnderstand的属性值设为 接受该消息的服务器必须在该transaction节点上执行中间处理您可以对此 作这样的解释服务器与客户端事先已就管理该报头元素处理的语义达成了一 致因而服务器确切地知道要处理的元素的内容本例中元素的内容是 如果接收消息的服务器不理解transaction报头的语义它就会拒绝请求并抛出 一个错误错误元素是soap报文和定义良好的机制的一个特殊部分用于把错误信 息送回给客户端 像这样的中间处理节点是soap可扩展性的一个例子客户端在soap消息中包含 这样的节点以在可以处理消息的报文内容前指示要发生的特殊的处理需要 要保证向后兼容不能提供这种处理的现有的服务器只需把mustunderstand 属性设置为它使操作是可选的 除了定义像上例中所示的transaction节点外soap消息还可包含报头项目 它们用于指定节点执行身份验证处理加密状态的永久性业务逻辑处理等 报头有助于把soap构建成一种可扩展的模态包模型只需记住报头处理是完全独 立于soap消息的报文的 报文上面例子中的SOAP报文包含一个XML载荷我们可以推测RPC没有为我们对其作 详细解释SOAP不仅是一种模态包模型它还是一种相当神秘的包模型 没有什么迹象清楚地显示rpc将要开始做什么我们在报文中所看到的是几个 xml元素其中一个用命名空间进行了限制它取决于soap服务器理解文档语义并 执行正确的处理事实上服务器提供了一种架构以有意义的方式处理xml载 荷这里的有意义意味着服务器在某些后台数据库上调用远程过程以为消 息报文中包含的股票符号元素接收股票价格所有这些魔术般的操作都是在soap rpc幕后发生的 soaprpc SOAP消息本质上是一种从发送方到接收方的单向传输但是SOAP经常组合到实 现请求/响应机制中要让RPC使用SOAP必须遵循几条规则首先请求和响应 消息必须被编码成结构类型对一个操作的每一个输入参数都必须有一个同名 元素(或输入结构的成员)作为参数对每一个输出参数都必须有一个名称匹 配的元素(或输出结构的成员) 基于rpc的观点会省略一些更早一点显示的soap消息只带有报文部分的 soap请求与响应封套如下所示 请求<SOAPENVBody> <mGetLastTradePrice xmlnsm=someURI> <symbol>DEF</Symbol> </mGetLastTradePrice> </SOAPENVBody> 响应<SOAPENVBody> <mGetLastTradePriceResponse xmlnsm=someURI> <price></price> </m GetLastTradePriceResponse> </SOAPENVBody> 请求要调用getlasttradeprice方法注意响应定义了 getlasttradepriceresponse操作对附加响应到响应操作尾部的 一个常用的soap调用规则是创建响应结构这种输出结构包含一个名称为 price的元素它返回方法调用的结果假定为浮点型 在soap封套中没有什么地方的数据类型是显式声明的注意到这一点很重要 这样如果只查看soap消息就不会知道符号类型或结果参数price(价格)的类 型客户端应用程序一般通过section 编码定义数据类型或通过与服务器 私下达成的协议来定义数据类型在任何一种情况下这些包含在soap消息中的 定义都不是显式的 最后为了进行rpc需要一种低级协议如http尽管soap 规范强制要求 使用http作为传输协议但soap 规范(及其姊妹规范带有附件的soap消息 )允许使用ftpsmtp甚至(可能)原始的tcp/ip套接字所有这些对soap通用 的序列化和编码规则也适用于rpc参数 soap用例 图SOAP用例处理步骤用(单击图片可将其放大) 现在您看到的就是详细的SOAP封套图它能帮助我们后退一步从用例的角度观 察SOAP以帮助我们领会在分布式Web环境中一个来回的处理过程此处列出了几 条构成Web服务和SOAP的概念中枢的显目的概括性命题 internet上某些地方的客户端应用程序使用web服务 Web服务(通过SOAP)显示对象方法 对象方法访问Web上任意位置的远程数据 对这些网络命题应用传递逻辑我们可以为Web服务和SOAP下一个总的结论 某些位置的客户端可以使Web上任意位置的数据这就是所要证明的 下面是更加详细一点的用例 soap客户端使用uddi注册来查找web服务不用直接操作wsdl大多数情况 下soap应用程序将硬连接到使用特定类型的端口和特定样式的绑定并且它将 通过uddi动态配置要调用的与发现的web服务匹配的服务地址 客户端应用程序创建SOAP消息它是一个可执行想要的请求/响应操作的 XML文档 客户端把SOAP消息传送给监听SOAP请求的Web服务器上的JSP或ASP页面 SOAP服务器解析SOAP包并在其领域调用合适的对象方法在SOAP文档中包 含的参数中传递在SOAP服务器接收消息之前中间处理节点可以执行SOAP报 头指示的特殊功能可视情况确定是否执行这步操作 请求对象执行指示的功能并返回数据给SOAP服务器它把响应打包到 SOAP封套中服务器把SOAP封套包裹在要发送回请求机器的响应对象中如 servlet或COM对象 客户端接收对象剥离出SOAP封套并把响应文档发送给最初发出请求的程 序完成请求/响应循环 小结SOAP是一种基于XML的协议它用于在分布式环境中发送消息并执行远程过 程调用使用SOAP不用考虑任何特定的传输协议(尽管通常选用HTTP协议) 就能使数据序列化 用soap来构建平台与语言中性的互操作系统是一个好的选择总之soap和 web服务已为在xml上构建分布式应用程序基础结构所需的一切都考虑好了通过 解决com和java组件对象模型之间的沖突soap把多个平台在访问数据时所出现的 不兼容性问题减至最少 先把这些讨论放在一边soap是一种适用于所有类型的对象实体的理想的媒介 ??即使对于像brad pitt和edward norton之类的好莱坞电影角色??也可用作 一种通信媒介就像在电影中一样期待着这种新技术带来震撼世界的效果 参考文献《A Framework for Using Web Services》作者Simeon Simonov刊登 《XML》杂志第卷第期上 《soap in the java platform introducing the jaxrpc technology》 roberto chinnici和rahul sharma在年月的javaone开发人员讨论会上的 演讲稿 《理解soap》作者kennard scribner和marc c stiver sams出 版社年出版(这本书非常吸引人该书的两位作者从高度的技术层面揭示 soap和网络技术该书以流畅的风格从最低层次的细节角度宣扬了呆在一个 地方做所有的工作的理念该书是具有xml和web服务经验的开发人员成为 soap专家必读的经典力作) 《writing your first web service》 作者 andy mccright 刊登在年 月预发行的《web服务》杂志上 《xml and soap programming for biztalk servers》 作者 brian e travis microsoft 出版社出版 (不要让这本书的书名迷惑了你 这是一本优秀的介绍web服务和soap的中高级书籍 其内容精彩结构组织非 常优秀 其中介绍biztalk最基本知识的内容占了全书很大比例是一本适合于 初学者阅读的经典的着作 作者介绍Tom Clements是一名技术类书籍和诗歌自由撰稿人擅长于Java APIXML/XSLT设备驱动程序及无线通信等技术 |