('概述SOAP:简单对象访问协议,简单对象访问协议(SOAP)是一种轻量的、简单的、基于XML的协议,它被设计成在WEB上交换结构化的和固化的信息。SOAP可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议(HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME)。它还支持从消息系统到远程过程调用(RPC)等大量的应用程序。简介四个部分soap。n.(英文)肥皂SOAP:简单对象访问协议(SOAP:SimpleObjectAccessProtocol)SOAP包括四个部分:SOAP封装:它定义了一个框架,该框架描述了消息中的内容是什么,谁应当处理它以及它是可选的还是必须的。SOAP编码规则:它定义了一种序列化的机制,用于交换应用程序所定义的数据类型的实例。SOAPRPC表示:它定义了用于表示远程过程调用和应答的协定。SOAP绑定:定义了一种使用底层传输协议来完成在节点间交换SOAP封装的约定。SOAP消息基本上是从发送端到接收端的单向传输,但它们常常结合起来执行类似于请求/应答的模式。所有的SOAP消息都使用XML编码。一条SOAP消息就是一个包含有一个必需的SOAP的封装包,一个可选的SOAP标头和一个必需的SOAP体块的XML文档。把SOAP绑定到HTTP提供了同时利用SOAP的样式和分散的灵活性的特点以及HTTP的丰富的特征库的优点。在HTTP上传送SOAP并不是说SOAP会覆盖现有的HTTP语义,而是HTTP上的SOAP语义会自然的映射到HTTP语义。在使用HTTP作为协议绑定的场合中,RPC请求映射到HTTP请求上,而RPC应答映射到HTTP应答。然而,在RPC上使用SOAP并不仅限于HTTP协议绑定。SOAP也可以绑定到TCP和UDP协议上。协议结构SOAP消息格式:SOAP标头目前主要在web服务中运用。语法规则这里是一些重要的语法规则:SOAP消息必须用XML来编码SOAP消息必须使用SOAPEnvelope命名空间SOAP消息不能包含DTD引用SOAP消息不能包含XML处理指令SOAP核心技术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不需要具体的对象绑定到一个给定的终端,而是由具体实现程序来决定怎样把对象终端标识符映像到服务器端的对象。SOAP的优点(1)SOAP是可扩展的。SOAP无需中断已有的应用程序,SOAP客户端、服务器和协议自身都能发展。而且SOAP能极好地支持中间介质和层次化的体系结构。(2)SOAP是简单的。客户端发送一个请求,调用相应的对象,然后服务器返回结果。这些消息是XML格式的,并且封装成符合HTTP协议的消息。因此,它符合任何路由器、防火墙或代理服务器的要求。(3)SOAP是完全和厂商无关。SOAP可以相对于平台、操作系统、目标模型和编程语言独立实现。另外,传输和语言绑定以及数据编码的参数选择都是由具体的实现决定的。(4)SOAP与编程语言无关。SOAP可以使用任何语言来完成,只要客户端发送正确SOAP请求(也就是说,传递一个合适的参数给一个实际的远端服务器)。SOAP没有对象模型,应用程序可以捆绑在任何对象模型中。(5)SOAP与平台无关。SOAP可以在任何操作系统中无需改动正常运行。PHPSOAP实例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、SoapServerSoapServer用于创建php服务器端页面时定义可被调用的函数及返回响应数据。创建一个SoapServer对象的语法格式如下:$soap=newSoapServer($wsdl,$array);其中,$wsdl为soap使用得wsdl文件,wsdl是描述WebService的一种标准格式,若将$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、SoapClietSoapClient用于调用远程服务器上的SoapServer页面,并实现了对相应函数的调用。创建一个SoapClient对象的语法格式如下:$soap=newSoapClient($wsdl,$array);其中,参数$wsdl和$array与SoapServer相同。创建SoapClient对象后,调用服务端页面中的函数相当于调用了SoapClient的方法,创建语法如下:$soap->user_function($params);其中,$soap是一个SoapClient对象,user_function是服务器端要调用的函数,$params是要传入函数的参数。3、SoapFaultSoapFault用于生成soap访问过程中可能出现的错误。创建一个soapFault对象的语法格式如下:$fault=newSoapFault($faultcode,$faultstring);其中,$faultcode是用户定义的错误代码,$faultstring是用户自定义的错误信息。soapFault对象会在服务器端页面出现错误时自动生成,或者通过用户自行创建SoapFault对象时生成。对于Soap访问时出现的错误,客户端可通过捕捉SoapFalut对象来获得相应的错误信息。在客户端捕获SoapFault对象后,可以通过下面的代码获得错误代码和错误信息。$fault->faultcode;//错误代码$fault->faultstring;//错误信息其中,$fault是在前面创建的SoapFault对象。约翰·“肥皂”·麦克塔维什上尉(Cpt.John`Soap`MacTavish):《使命召唤-现代战争》中的重要人物兼主人公。《使命召唤4:现代战争》及《使命召唤6:现代战争2》的主角。在4代中,还只是中士的他和队长普莱斯一同参加了SAS的所有任务,在最后一关扎卡耶夫杀死了除肥皂和普莱斯之外的所有SAS队员,但普莱斯扔给肥皂一把M1911,肥皂用这把M1911结果了扎卡耶夫的性命。使他二人转危为安,之后被赶来救援的以队长卡马洛夫为首的俄政府军所救。而在5年后(6代)他已升任上尉(可能是因为杀死扎卡耶夫的缘故),加入141特勤队,并成为队长。在游戏中代替普莱斯上尉的位置来指导玩家(141特勤队的ROACH“小强”)作战。后在141特勤队的主人公“小强”死后再度成为游戏的主人公。并和普莱斯一起杀入谢菲尔德将军的基地,杀死了谢菲尔德将军,可他也身负重伤。最后被普莱斯和前来增援的尼古莱一同抬上了飞机。(肥皂和普莱斯已经成为全球通缉犯)外号SOAP,中文名:肥皂消息格式SOAP在标准化消息格式环境中,可以做所有它能完成的工作。消息的主体部分是“text/xml”形式的MIME类型,并且包含一个SOAP封套。该封套是一个XML文档。封套包含了报头(可选的)和报文(必须有的)。封套的报文部分总是用于最终接收的消息,而报头项目可以确定执行中间处理的目标节点。附件、二进制数字及其他项目可以附加到报文上。SOAP提供了一种让客户端指定哪个中间处理节点必须处理报头项目的方法。由于报头与SOAP消息的主体内容是互不相关的,所以可用它们给消息添加信息,而不会影响对消息报文的处理。例如,报头可用于为报文中包含的请求提供数字签名。在这种情形下,身份验证/授权服务器可以处理报头项目独立于报文可以剥离信息以验证签名。一旦通过验证,封套的其余部分将被传递给SOAP服务器,它将对消息的报文进行处理。深入研究一下SOAP封套,有助于明了SOAP报头和报文元素的位置和用途。剖析SOAP封套SOAP1.1规范提供了下面的封套示例:SOAP-ENV:mustUnderstand="1"5DEF在这个例子中,GetLastTradePrice请求被传送给网络上某个位置的一个存储-引用服务。该请求带有一个字符型参数,一个订单符号,并在SOAP响应中返回一个浮点数。SOAP封套是表示SOAP消息的XML文档的顶层元素。XML命名空间用于将SOAP标识符与应用程序的特定标识符区分开。XML命名空间在SOAP中使用很频繁,以把消息的元素的作用域限制在一个特定的领域。理解SOAP命名空间有助于熟悉XML命名空间规范。如果您没有理解命名空间,也可以简单地把它看作一种邻近的标识符,它通过把SOAP元素与特定的位置(真实的或想像的)相关联,从而有助于惟一地标识SOAP元素。命名空间上面例子中的第一个命名空间参照了在SOAP消息中定义元素和属性的SOAP模式。第二个命名空间参照了SOAP编码,即前文中讨论过的“Section5”数据类型。由于没有指定额外的通用元素编码,这种编码将适用于整篇文档。报头在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载荷。这里的“有意义”意味着服务器在某些后台数据库上调用远程过程,以为消息报文中包含的股票-符号元素接收股票价格。所有这些魔术般的操作都是在SOAPRPC幕后发生的。SOAP-RPCSOAP消息本质上是一种从发送方到接收方的单向传输,但是SOAP经常组合到实现请求/响应机制中。要让RPC使用SOAP,必须遵循几条规则。首先,请求和响应消息必须被编码成结构类型。对一个操作的每一个输入参数,都必须有一个同名元素(或输入结构的成员)作为参数。对每一个输出参数,都必须有一个名称匹配的元素(或输出结构的成员)。基于RPC的观点,会省略一些更早一点显示的SOAP消息。只带有报文部分的SOAP请求与响应封套如下所示:请求DEF响应22.50请求要调用GetLastTradePrice方法。注意响应定义了GetLastTradePriceResponse操作。对附加响应到响应操作尾部的一个常用的SOAP调用规则是:创建响应结构。这种输出结构包含一个名称为price的元素,它返回方法调用的结果,假定为浮点型。在SOAP封套中没有什么地方的数据类型是显式声明的,注意到这一点很重要,这样如果只查看SOAP消息,就不会知道符号类型或结果参数price(价格)的类型。客户端应用程序一般通过“Section5”编码定义数据类型,或通过与服务器私下达成的协议来定义数据类型。在任何一种情况下,这些包含在SOAP消息中的定义都不是显式的。最后,为了进行RPC,需要一种低级协议如HTTP。尽管SOAP1.0规范强制要求使用HTTP作为传输协议,但SOAP1.1规范(及其姊妹规范“带有附件的SOAP消息”)允许使用FTP、SMTP、甚至(可能)原始的TCP/IP套接字。所有这些对SOAP通用的序列化和编码规则,也适用于RPC参数。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是一种适用于所有类型的对象实体的理想的媒介即使对于像BradPitt和EdwardNorton之类的好莱坞电影角色也可用作一种通信媒介。就像在电影中一样,期待着这种新技术带来震撼世界的效果。',)