1SimpleObjectAccessProtocol(SOAP)简单对象访问协议SOAP产生的背景随着计算机技术的不断发展,企业越来越需要具有广泛兼容能力,可以支持不同平台、数据格式和多种连接方式,并且与语言无关,与特定接口无关的通讯协议。什么是SOAP?WebServices协议栈UbiquitousCommunications:InternetUniversalDataFormat:XMLServiceInteractions:SOAPFormalServiceDescriptions:WSDLSimple,Open,BroadIndustrySupportPublish,Find,UseServices:UDDI常规的分布式对象通信协议,CORBA、DCOM、Java/RMI,存在一些致命的弱点。常规的分布式对象通信协议,具有对称性需求:通信连接的两端需要使用同一分布式对象模型实现,需要开发共用的库进行部署。SOA有助于在各类程序和平台之间实现互操作性。从而使更多的用户访问已有的应用。SOAP是基于XML的通信协议,在两台计算机之间交换消息,无须考虑这两台计算机的OS、编程环境或对象模型框架。SOAP概览SOAP(SimpleObjectAccessProtocol)简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议。SOAP技术有助于实现大量异构程序和平台之间的互操作性,从而使存在的应用能够被广泛的用户所访问。SOAP是把成熟的基于HTTP的WEB技术与XML的灵活性和可扩展性组合在了一起。SOAP=RPC+HTTP+XML用HTTP作为底层通讯协议;RPC作为一致性的调用途径;XML作为数据传送的格式,允许服务提供者和服务客户经过防火墙在INTERNET进行通讯交互.WhatisSOAPSOAP本身并不定义任何应用语义,如编程模型或特定语义实现,它只定义了一种简单的以模块化的方式包装数据的机制。将数据/对象打包成XML格式的数据publicclassPerson{Stringname;intage;//方法的定义...}Personnamezhang3/nameage20/age/Person选择SOAP的原因它是使用XML传送以文档为中心的消息以及远程过程调用的标准化封装机制。SOAP很简单;它基本上是一个用XML信封作为有效负载的HTTPPOST。SOAP定义了一个标准机制,使用SOAP报头和对操作或函数进行标准编码的消息。SOAP消息支持Web服务体系结构中的发布、查找和绑定操作。一个简单的SOAP请求/响应假设有上述接口定义的服务存在客户端在远程调用sayHelloTo方法时,提供一个名字,期望返回一个字符串假设JavaRMI、CORBA、DCOM都不存在,开发者必须负责将方法调用串行化,并把消息发给远程服务器。一个简单的方式是使用XMLpublicinterfaceHello{publicStringsayHelloTo(Stringname);}一个简单的SOAP请求/响应用XML打包请求将接口名作为根结点方法和参数作为结点将请求发送给服务器不创建自己的TCP/IP消息,利用HTTP将请求封装成HTTPPOST请求格式发出?xmlversion=1.0?HellosayHelloTonameJohn/name/sayHelloTo/Hello一个简单的SOAP请求/响应服务器接收到请求,解码XML,处理请求,然后以XML格式向客户发送响应与请求比较,方法的结点名字变为请求的方法名后缀Response客户程序知道自己调用了哪个方法,根据方法名后缀Response寻找调用方法的返回值?xmlversion=1.0?HellosayHelloToResponsemessageHelloJohn,Howareou?/message/sayHelloToResponse/HelloSOAP基于XML的协议,由四部分组成:信封(Envelope):定义了一个消息框架,描述消息的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理。编码规则(EncodingRules):用于表示应用程序需要使用的数据类型的实例。绑定(Binding):定义底层通信协议,进行消息交换。RPC:表示远程过程调用和应答的协定。SOAP协议SOAP由4部分组成:SOAP封装(SOAPEnvelope)构造定义了一个整体的表示框架,可用于表示在消息中的是什么谁应当处理它是“可选的”还是“强制的”SOAP编码规则(SOAPEncodingRules)用于表示应用程序需要使用的数据类型的实例。SOAPRPC表示(SOAPRPCPresentation)表示远程过程调用和应答的协定SOAP绑定(SOAPBinding)定义底层通信协议,进行消息交换。SOAP术语数据封装概念SOAP消息SOAP消息是在对等的SOAP节点间通信的基本单位SOAP封装SOAP封装(SOAPEnvelope)是SOAP规范中定义的SOAP消息在文法上的最外层结构。它包含了所有其它的元素。至少定义了SOAP命名空间。SOAP条目SOAP条目是一个文法上的结构,它用于包含一个逻辑上的单一元素,这一元素是SOAP节点处理的。封装在SOAPheader中SOPA条目成为Header条目,而封装在SOAPbody中的SOAP条目为Body条目SOAP术语消息发送者和接收者概念SOAP发送者发出SOAP消息的节点SOAP接收者接收SOAP消息的节点SOAP消息路径为传送一个简单的SOAP消息而要经过的一组SOAP发送者和SOAP接收者。其中包含了初始SOAP发送者、0个或多个SOAP中介以及最终SOAP接收者。SOAP消息结构SOAP定义了基于XML的消息文档、规则和机制,可用于实现应用程序之间的通信一条SOAP消息就是一个普通的XML文档,该文档包含下列元素:Envelope(信封)元素,必需,可把此XML文档标识为一条SOAP消息Header(报头)元素,可选,包含头部信息Body(主体)元素,必需,包含所有的调用和响应信息Fault元素,位于Body内,可选,提供有关处理此消息所发生错误的信息attachment(附件),可选,可通过添加一个或多个附件扩展SOAP消息SOAP结构SOAP消息是由一个SOAPEnvelope、一个可选的SOAPHeader和一个SOAPBody组成的XML文档。SOAP消息结构HeaderSOAPMessageWithattachementsEnvelopeBodyAttachment1Attachmentn……HeaderitemSOAPEnvelopeSOAPHeader……HeaderitemBodyitemSOAPBody……Bodyitem带附件的SOAP消息的结构19消息格式SOAPEnvelopeSOAPHeaderHeaderblockHeaderblockSOAPBodyMessageBody•信头部分包含了关于如何处理消息的参数信息:•路由和传输设置•授权和认证断言•事务上下文•信体部分包含了被传输和处理的实际消息20总结:SOAP消息结构EnvelopeHeader(optional)目标信息,扩展信息处理安全的位置Body存放有效负载payloadSOAPEnvelopeSOAPHeaderSOAPBodyPayloadDocument(s)SOAPFaultHeader条目的编码规则包括:一个SOAPHeader条目由一个完整修饰的元素名来标识,所谓完整修饰的元素名是由一个命名空间URI和局部名来组成。SOAPHeader元素的所有直接子元素都必须是完整修饰的。encodingStyle属性可以用于指明Header条目的编码风格。role属性和SOAPmustUnderstand属性可以用于指明由哪个SOAP结点来处理条目以及如何处理条目。SOAP用例env:Envelopexmlns:env=:Headern:alertcontrolxmlns:n=:priority1/n:priorityn:expires2001-06-22T14:00:00-05:00/n:expires/n:alertcontrol/env:Headerenv:Bodym:alertxmlns:m=:msgPickupMaryatschoolat2pm/m:msg/m:alert/env:Body/env:EnvelopeEnvelopeSOAP的设计目标SOAP的主要设计目标是简单性和可扩展性简明性主要表现在整个SOAP规范定义的消息结构非常简单(一个envelope包含了两个组成部分:header和body),除了这个基本消息结构外,SOAP没有定义额外的表述结构标准,没有定义自己的编码格式,也没有定义自己的传输协议。可扩展性则主要表现在SOAP可以使用任意的模式定义方式来定义内部传输内容的结构,可以与任意的网络传输协议联合使用完成传输。由于简明性和可扩展性的要求,这就意味着有一些传统消息系统或分布式对象系统中的特性将不包含在SOAP的核心规范中。这些特性包括:分布式垃圾收集(distributedgarbagecollection);批量消息传输/处理(boxcarringorbatchingofmessages);对象引用(objects-by-reference,需要分布式垃圾收集的支持);对象激活(activation,需要对象引用的支持)。SOAP以上就是SOAP的基本思路SOAP是一种即将深入渗透到未来的分布式计算的技术2425真实版的SOAP编码SOAP:Envelopexmlns:SOAP=:xsi=:xsd=:Header/SOAP:HeaderSOAP:Bodydd:sayHelloToxmlns:dd=:encodingStyle=:type=xsd:stringJohn/name/dd:sayHelloTo/SOAP:Body/SOAP:Envelope接口名字方法名字参数名称、类型实参26真实版的SOAP应答SOAP:Envelopexmlns:SOAP=:xsi=:xsd=:Bodydd:sayHelloToResponsexmlns:dd=“donald.hebtu.edu.cn/2010/HelloSOAP:encodingStyle=