文档库 最新最全的文档下载
当前位置:文档库 › SOAP介绍

SOAP介绍

SOAP 核心技术[/title] SOAP采用了已经广泛使用的两个协议:HTTP 和XML。HTTP用于实现 SOAP 的RPC 风格的传输, 而XML 是它的编码模式。采用几行代码和一个XML 解析器, HTTP 服务器( MS 的 IIS 或 Apache) 立刻成为SOAP 的 ORBS。SOAP 通讯协议使用 HTTP 来发送XML 格式的信息。HTTP与RPC 的协议很相似,它简单、 配置广泛,并且对防火墙比其它协议更容易发挥作用。HTTP 请求一般由 Web 服务器软件(如 IIS 和Apache)来处理, 但越来越多的应用服务器产品正在支持HTTP。XML 作为一个更好的网络数据表达方式( NDR)。SOAP 把 XML 的使用代码化为请求和响应参数编码模式, 并用HTTP 作传输。具体地讲, 一个SOAP 方法可以简单地看作遵循SOAP编码规则的HTTP请求和响应, 一个 SOAP 终端则可以看作一个基于HTTP 的URL, 它用来识别方法调用的目标。像CORBA/ IIOP一样, SOAP不需要具体的对象绑定到一个给定的终端, 而是由具体实现程序来决定怎样把对象终端标识符映像到服务器端的对象。[title]SOAP 的优点[/title] (1) SOAP 是可扩展的。SOAP 无需中断已有的应用程序, SOAP 客户端、 服务器和协议自身都能发展。 而且SOAP 能极好地支持中间介质和层次化的体系结构。 (2) SOAP 是简单的。客户端发送一个请求,调用相应的对象, 然后服务器返回结果。这些消息是XML 格式的,并且封装成符合HTTP 协议的消息。因此,它符合任何路由器、 防火墙或代理服务器的要求。 (3) SOAP 是完全和厂商无关。SOAP可以相对于平台、 操作系统、 目标模型和编程语言独立实现。另 外,传输和语言绑定以及数据编码的参数选择都是由具体的实现决定的。 (4) SOAP 与编程语言无关。SOAP 可以使用任何语言来完成, 只要客户端发送正确SOAP 请求( 也就 是说, 传递一个合适的参数给一个实际的远端服务器)。SOAP 没有对象模型, 应用程序可以捆绑在任何 对象模型中。 (5) SOAP 与平台无关。SOAP 可以在任何操作系统中无需改动正常运行。[title]PHP SOAP实例[/title] php提供了一个专门用于soap操作的扩展库,使用该扩展库后 可以直接在php中进行soap操作。下面将介绍soap的基本操作。 一、soap扩展的使用方法 php的soap扩展库通过soap协议实现了客服端与服务器端的 数据交互操作。从php5.0后,php就自带了soap的支持。使用 soap扩展库首先需要修改php安装目录下的配置文件php.ini 来激活soap扩展库。 在php.ini文件中找到如下所示的一行代码,去掉前面的注释(;)。 ;extension=php_soap.dll 修改后,重启web服务器即可激活soap扩展。在soap扩展库中,主要 包括三种对象。 1、SoapServer SoapServer用于创建p

hp服务器端页面时定义可被调用的函数及返回 响应数据。创建一个SoapServer对象的语法格式如下: $soap = new SoapServer($wsdl,$array); 其中,$wsdl为soap使用得wsdl文件,wsdl是描述Web Service的一种 标准格式,若将$wsdl设置为null,则表示不使用wsdl模式。$array是 SoapServer的属性信息,是一个数组。 SoapServer对象的addFunction方法是用来声明哪个函数可以被客户端调用, 语法格式如下: $soap->addFunction($function_name); 其中,$soap是一个SoapServer对象,$function_name是需要被调用的函数名。 SoapServer对象的handle方法用来处理用户输入并调用相应的函数,最后返回 给客户端处理的结果。语法格式如下: $soap->handle([$soap_request]); 其中,$soap是一个SoapServer对象,$soap_request是一个可选参数,用来表示 用户的请求信息。如果不指定$soap_request,则表示服务器将接收用户的全部 请求。 2、SoapCliet SoapClient用于调用远程服务器上的SoapServer页面,并实现了对相应函数的调用 。创建一个SoapClient对象的语法格式如下: $soap = new SoapClient($wsdl,$array); 其中,参数$wsdl和$array与SoapServer相同。 创建SoapClient对象后,调用服务端页面中的函数相当于调用了SoapClient的方法, 创建语法如下: $soap->user_function($params); 其中,$soap是一个SoapClient对象,user_function是服务器端要调用的函数,$params 是要传入函数的参数。 3、SoapFault SoapFault用于生成soap访问过程中可能出现的错误。创建一个soapFault对象的语法格式 如下: $fault = new SoapFault($faultcode,$faultstring); 其中,$faultcode是用户定义的错误代码,$faultstring是用户自定义的错误信息。soapFault 对象会在服务器端页面出现错误时自动生成,或者通过用户自行创建SoapFault对象时生成。对于 Soap访问时出现的错误,客户端可通过捕捉SoapFalut对象来获得相应的错误信息。 在客户端捕获SoapFault对象后,可以通过下面的代码获得错误代码和错误信息。 $fault->faultcode;//错误代码 $fault->faultstring;//错误信息 其中,$fault是在前面创建的SoapFault对象。[title]约翰·“肥皂”·麦克塔维什上尉[/title] (Cpt. John`Soap`MacTavish):《使命召唤 [img]title= style=right src=61183b2dcc060d04349bf7f9[/img]-现代战争》中的重要人物兼主人公。 《使命召唤4:现代战争》及《使命召唤6:现代战争2》的主角。 在4代中,还只是中士的他和队长普莱斯一同参加了SAS的所有任务,在最后一关扎卡耶夫杀死了除肥皂和普莱斯之外的所有SAS队员,但普莱斯扔给肥皂一把

M1911,肥皂用这把M1911结果了扎卡耶夫的性命。使他二人转危为安,之后被赶来救援的以队长卡马洛夫为首的俄政府军所救。 而在5年后(6代)他已升任上尉(可能是因为杀死扎卡耶夫的缘故),加入141特勤队,并成为队长。在游戏中代替普莱斯上尉的位置来指导玩家 [img]title= style=right src=9a1151c29949a005e5dd3bf8[/img](141特勤队的ROACH“小强”)作战。后在141特勤队的主人公“小强”死后再度成为游戏的主人公。并和普莱斯一起杀入谢菲尔德将军的基地,杀死了谢菲尔德将军,可他也身负重伤。最后被普莱斯和前来增援的尼古莱一同抬上了飞机。(肥皂和普莱斯已经成为全球通缉犯) 外号SOAP,中文名:肥皂[title]消息格式[/title] SOAP在标准化消息格式环境中,可以做所有它能完成的工作。消息的主体部分 是“text/xml”形式的MIME类型,并且包含一个SOAP封套。该封套是一个XML文 档。封套包含了 [img]title= style=right src=e8112b2a319044005243c122[/img]报头(可选的)和报文(必须有的)。封套的报文部分总是用于 最终接收的消息,而报头项目可以确定执行中间处理的目标节点。附件、二进制 数字及其他项目可以附加到报文上。 SOAP提供了一种让客户端指定哪个中间处理节点必须处理报头项目的方法。由 于报头与SOAP消息的主体内容是互不相关的,所以可用它们给消息添加信息,而 不会影响对消息报文的处理。 例如,报头可用于为报文中包含的请求提供数字签名。在这种情形下,身份验 证/授权服务器可以处理报头项目独立于报文可以剥离信息以验证签名。 一旦通过验证,封套的其余部分将被传递给SOAP服务器,它将对消息的报文进行 处理。深入研究一下SOAP封套,有助于明了SOAP报头和报文元素的位置和用途。[title]剖析SOAP封套[/title] SOAP 1.1规范提供了下面的封套示例:SOAP-ENV:mustUnderstand="1" 5DEF 在这个例子中,GetLastTradePrice请求被传送给网络上某个位置的一个存储 -引用服务。 该请求带有一个字符型参数,一个订单符号,并在SOAP响应中返回一 个浮点数。SOAP封套是表示SOAP消息的XML文档的顶层元素。XML命名空间用于将SOAP标识 符与应用程序的特定标识符区分开。XML命名空间在SOAP中使用很频繁,以把消息 的元素的作用域限制在一个特定的领域。理解SOAP命名空间有助于熟悉XML命名空 间规范。如果您没有理解命名空间,也可以简单地把它看作一种邻近的标识符, 它通过把SOAP元素与特定的位置(真实的或想像的)相关联,从而有助于惟一地 标识SOAP元素。 命名空间 上面例子中的第一个命名空间参照了

在SOAP消息中定义元素和属性的SOAP模式。 第二个命名空间参照了SOAP编码,即前文中讨论过的“Section 5”数据类型。 由于没有指定额外的通用元素编码,这种编码将适用于整篇文档。 报头 在SOAP封套报头示例中标识的第一个元素是一个transaction(交易)元素,它 带有一个命名空间属性和一个值为1的mustUnderstand属性。既然mustUnderstand的属性值设为1 ,接受该消息的服务器必须在该transaction节点上执行中间处理。您可以对此 作这样的解释:服务器与客户端事先已就管理该报头元素处理的语义达成了一 致,因而服务器确切地知道要处理的元素的内容,本例中元素的内容是“5”。 如果接收消息的服务器不理解transaction报头的语义,它就会拒绝请求并抛出 一个错误。错误元素是SOAP报文和定义良好的机制的一个特殊部分,用于把错误信 息送回给客户端。 像这样的中间处理节点是SOAP可扩展性的一个例子。客户端在SOAP消息中包含 这样的节点,以在可以处理消息的报文内容前,指示要发生的特殊的处理需要。 要保证向后兼容不能提供这种处理的现有的服务器,只需把mustUnderstand 属性设置为0,它使操作是可选的。除了定义像上例中所示的transaction节点外,SOAP消息还可包含报头项目, 它们用于指定节点执行身份验证处理、加密、状态的永久性、业务逻辑处理等。 报头有助于把SOAP构建成一种可扩展的模态包模型。只需记住报头处理是完全独 立于SOAP消息的报文的。 报文 上面例子中的SOAP报文包含一个XML载荷,我们可以推测RPC没有为我们对其作 详细解释。SOAP不仅是一种模态包模型,它还是一种相当神秘的包模型。没有什么迹象清楚地显示RPC将要开始做什么。我们在报文中所看到的是几个 XML元素,其中一个用命名空间进行了限制。它取决于SOAP服务器理解文档语义并 执行正确的处理。事实上,服务器提供了一种架构,以有意义的方式处理XML载 荷。这里的“有意义”意味着服务器在某些后台数据库上调用远程过程,以为消 息报文中包含的股票-符号元素接收股票价格。所有这些魔术般的操作都是在SOAP RPC幕后发生的。[title]SOAP-RPC[/title] SOAP消息本质上是一种从发送方到接收方的单向传输,但是SOAP经常组合到实 现请求/响应机制中。要让RPC使用SOAP,必须遵循几条规则。首先,请求和响应 消息必须被编码成结构类型。对一个操作的每一个输入参数,都必须有一个同名 元素(或输入结构的成员)作为参数。对每一个输出参数,都必须有一个名称匹 配的元素(或输出结构的成员)。 基于RPC的观点,会省略一些更早一点显示的

SOAP消息。只带有报文部分的 SOAP请求与响应封套如下所示: 请求 DEF响应 22.50请求要调用GetLastTradePrice方法。注意响应定义了 GetLastTradePriceResponse操作。对附加响应到响应操作尾部的 一个常用的SOAP调用规则是:创建响应结构。这种输出结构包含一个名称为 price的元素,它返回方法调用的结果,假定为浮点型。 在SOAP封套中没有什么地方的数据类型是显式声明的,注意到这一点很重要, 这样如果只查看SOAP消息,就不会知道符号类型或结果参数price(价格)的类 型。客户端应用程序一般通过“Section 5”编码定义数据类型,或通过与服务器 私下达成的协议来定义数据类型。在任何一种情况下,这些包含在SOAP消息中的 定义都不是显式的。 最后,为了进行RPC,需要一种低级协议如HTTP。尽管SOAP 1.0规范强制要求 使用HTTP作为传输协议,但SOAP 1.1规范(及其姊妹规范“带有附件的SOAP消息” )允许使用FTP、SMTP、甚至(可能)原始的TCP/IP套接字。所有这些对SOAP通用 的序列化和编码规则,也适用于RPC参数。[title]SOAP用例[/title] 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封套并把响应文档发送给最初发出请求的程 序,完成请求/响应循环。[title]小结[/title] SOAP是一种基于XML的协议,它用于在分布式环境中发送消息,并执行远程过 程调用。使用SOAP,不用考虑任何特定的传输协议(尽管通常

选用HTTP协议), 就能使数据序列化。用SOAP来构建平台与语言中性的互操作系统是一个好的选择。总之,SOAP和 Web服务已为在XML上构建分布式应用程序基础结构所需的一切都考虑好了。通过 解决COM和Java组件对象模型之间的冲突,SOAP把多个平台在访问数据时所出现的 不兼容性问题减至最少。先把这些讨论放在一边,SOAP是一种适用于所有类型的对象实体的理想的媒介 即使对于像Brad Pitt和Edward Norton之类的好莱坞电影角色也可用作 一种通信媒介。就像在电影中一样,期待着这种新技术带来震撼世界的效果。

相关文档