1 其实Web Services 的核心就是SOAP和WSDL,它们隐含于J2EE WebServices平台的通信层于部署层
2 什么是SOAP
SOAP最初是简单对象访问协议(即Simple Object AccessPropotol)的缩写,但它只是个名称而已。SOAP1.1是J2EE WebServices使用的标准消息传递协议,而且通常是Web服务的事实标准。
SOAP的主要应用是应用程序与应用程序之间的通信(A2A),且主要应用于商务对商务(B2B)的通信以及企业应用集成(EAI)。B2B和A2A是同一个问题的2个方面,两者都要解决集成软件应用程序以及共享数据这样的问题。为了使B2B和EAI真正起作用,协议必须是与平台无关,具有灵活性并且基于标准且通用的技术。
5为什么SOAP会非常受欢迎
5
<?xml version=”1.0” encoding=”UTF-8”?>
<soap:Envelope
Xmlns:soap=http://schemas.xmlsoap.org/soap/envelope/>
<soap:Body>
…………………
…………………………
………………….
</soap:Envelope>
SOAP消息与传统邮递服务中使用的信封类似。就像纸信封内包含信件一样,SOAP消息包含了XML数据。
SOAP中根元素为Envelope元素。
Envelope元素可以包含余个可选的Header元素,同时必须包含一个Body元素。
如果用户使用了Header元素,那么该元素必须是Envelope元素的直接子元素。并在Body元素之前。
Header元素以一个或多个不同XML元素的形式包含消息方面的信息,其中每一个元素描述与消息关联的服务的某些方面或质量(服务质量是说-------)
Header元素可以包含各种XML元素,这些XML元素用于描述安全凭证,ID,路由指令,或在Body元素中处理数据时涉及的其他非常重要的消息方面的信息。可以这样说,如果我们希望为每一个SOAP消息附加一个唯一的标识符,用于测试和登陆。虽然唯一标识符不是SOAP协议本身的部分,但用户可以容易的向Herder元素添加标识符,如下例:
<?xml version = “1.0” encoding = “UTF-8”?>
<soap:Envelope
Xmlns:soap=”http://schemas.xmlsoap.org/soap/envelope”
Xmlns:mi=”http://www.Monson-Haefel.com/jwsbook/message-id “>
<soap:Body>
</soap:Body>
</soap:Envelope>
值得注意的是:message-id元素称为文件头,并且该元素是由其自己的命名空间标识的任意XML元素。
又如下面例子,带XML数字签名文件头的SOAP消息
: <?xml version = “1.0” encoding = “UTF-8”?>
<soap:Envelope>
Xmlns:soap=”http://schemas.xmlsoap.org/soap/envelope”
Xmlns:mi=”http://www.Monson-Haefel.com/jwsbook/message-id “
Xmlns:sec=http://schemas.xmlsoap.org/soap/security/2000-12
Xmlns:ds=http://w3c.org/2000/09/xmldsig#>
<soap:Header>
</soap:Header>
</soap:Envelope>
也就是说,可以在Header元素中放入任意数量的文件头,而且每个代码快均由合适的对应的函数来处理。。。。
6
XML命名空间在SOAP里起着非常重要的作用。因为SOAP可以在Header和Body元素中包含若干不同的XML元素,为了避免冲突,必须使用唯一的命名空间来标识它们。
如下例:
<soap:Envelope>
Xmlns:soap=”http://schemas.xmlsoap.org/soap/envelope”
Xmlns:mi=”http://www.Monson-Haefel.com/jwsbook/message-id “
Xmlns:sec=http://schemas.xmlsoap.org/soap/security/2000-12
Xmlns:ds=http://w3c.org/2000/09/xmldsig#>
<soap:Header>
</soap:Header>
<soap:Body sec:id=”Body”>
</soap:Body>
</soap:Envelope>
正是因为SOAP使用了XML命名空间,所以使SOAP成为灵活且可扩展的协议。。命名空间完全限定了元素名称或属性名称。。
【注意】在Envelope元素声明的第一个命名空间定义了标准SOAP元素(即Envelop,Header,和Body元素)的命名空间。。。。如:
<soap:Envelope>
<Xmlns:soap=”http://schemas.xmlsoap.org/soap/envelope”>
</soap:Envelope>
此命名空间确定了所使用的SOAP1.1版本,SOAP消息必须使用Envelope元素的命名空间声明成如下标准的SOAP1.1信封命名空间:
<xmlns:soap=”http://schemas.xmlsoap.org/soap/envelope”>
此规则保证了所有确认消息使用完全相同的命名空间和XML模式。。。
Header元素中的每个文件头应有自己的命名空间,这一点非常重要,因为命名空间有帮助SOAP应用程序指定文件头并单独处理它们
SOAP 消息的所有本地元素都必须是命名空间限定的元素(就是SOAP1.1命名空间为前缀),因为SOAP1.1的XML模式将ElementFormDefault属性设置为了”qualified”,此外,Basicprofile1.0要求所有由Body元素包含的应用程序专用的元素必须喂限定元素。
同样可以通过声明xsi:schemaLocation属性来进行有效性检验,但大多数情况下,SOAP堆栈会在设计时处理此问题,并不需要在SOAP消息中显示的声明xsi:schemaLocation。
【解释】所谓的SOAP堆栈使用于处理和传递SOAP消息的代码库。比如,J2EE1.4,Microsoft.NET都用自己的SOAP堆栈,即用于处理SOAP消息的自己的代码库。
【补充】有些SOAP堆栈要大量利用XML模式实例命名空间来说明元素的数据类型(比如:xsi:type=”xsd:float”),可是有些SOAP则不一样。当接收方需要类型化元素但发送方没有类型化元素时,这样的堆栈就会出问题。根据BP&