SOAP学习
目前最新以及最流行的技术非XML莫数了,MS的OFFICE2003也发布了,据说也是基于XML开发的,具有很强的扩展性。
SOAP(Simple Object Access Protocol)简单对象访问协议。
SOAP也被称作XMLP,为两个程序交换信息提供了一种标准的工作机制。在各类机构之间通过电子方式相互协作的情况下完全有必要为此制定相应的标准。
交换信息可以采用很多方法,比如电子邮件、即时聊天和远程过程调用(RPC)等。电子邮件和聊天消息通常不具备计算机友好性。计算机可以读取电子邮件报头,但是其类型内容却无法得到计算机这个"硅脑袋"的理解。即时聊天和RPC也面临同样的尴尬情况:计算机倒是可读可人又没法读了。
计算机确实知道如何理解XML。SOAP描述了把消息捆绑为XML的工作方式。它还说明了发送消息的发送方、消息的内容和地址以及发送消息的时间。这也是为什么把SOAP叫做一种协议的原因。SOAP并没有同电子邮件协议(SMTP)、RPC(套接字和IDL)或者Web协议(HTTP)截然分开。SOAP要利用这些系统作为消息的起点。
SOAP是Web Service的基本通信协议。因为SOAP与DCOM和CORBA在概念上有相同之处,所以很多人在问:"SOAP是怎样激活对象的?"或"SOAP在使用什么命名服务(Naming Service)?"。或许在执行SOAP的过程当中会用到这些,但这些并不在SOAP规范要考虑的范畴之内。SOAP只是定义SOAP消息的XML格式(XML Format),如果你用一对SOAP标记(SOAP Elements)把XML文档括起来,那么这个就是一个SOAP消息,这不是很简单吗?
SOAP规范还定义了怎样用XML来描述程序数据(Program Data),怎样执行RPC(Remote Procedure Call)。这些可选的规范是为了构建RPC-style的应用程序(客户端SOAP消息包含函数名和在函数中用到的参数,而服务器端SOAP消息包含执行函数之后的结果)。大多数SOAP解决方案都支持RPC-style应用程序,因为很多程序员已对DCOM或CORBA熟悉。SOAP还支持 Document-style应用程序(SOAP消息只包含XML文本信息)。Document-style应用程序有很好的灵活性,所以很多用RPC很难构建的Web Service用这种方式构建。
最后SOAP规范还定义了HTTP消息是怎样传输SOAP消息的。这并不代表SOAP只能用HTTP来作为传输协议,MSMQ、SMTP、TCP/IP都可以做SOAP的传输协议。
很多大公司根据SOAP规范,都开发出了自己的SOAP解决方案。这些解决方案都是相对于某种语言。比如说Microsoft SOAP toolkit2.0把COM函数转换成SOAP消息,而Apache toolkit把JAVA函数转换成SOAP消息。这样难免带来一些兼容性问题。
现在SOAP的很多另人瞩目的特性已成为现实(SOAP已经运行于不同的硬件和软件平台),而且有70多个解决方案。之所以SOAP被人们所爱戴,是因为SOAP比其他同类技术(CORBA、DCE)简单易用。
安全性对于应用程序来说是很重要的。那么SOAP的安全性如何呢?对于把HTTP作为传输协议的SOAP来说是没有问题的,因为HTTP协议已经有很好的安全构架。那么用其他传输协议会出现安全问题吗?不是的,你不必担心,因为已经有这方面的规范了。
现在用JavaScript,HTML和Perl CGI这样的Web技术来解决简易目标访问协议(SOAP)通信原则是可以的。SOAP通信明显的不足在于这些方法没有适当的SOAP句法结构——所以这些是不标准的解决方案。
SOAP信息是无格式的老版本XML文件。XML提供了一种句法结构,这种句法结构能让你使用各种不同的标示。代替了<html>标签,SOAP规则描述了一种<envelope>标签。为了获得SOAP请求,三套标签是必需的。
既然标签都是配套组合的,就要在一个文档中去连接它们。这个文档就是SOAP通信。最后,通信必须被发送到某个地方。当然,你发送的并不是一个信息,而是一对信息:一套请求——应答信息。其中一个是发出“请处理数据”的消息,而另一个时发出“提交我所做的处理”的消息。
SOAP规则用HTTP来实现请求——应答通信——发送SOAP数据的过程在登陆Web页上和发送一个表格已经没有什么区别了。稍后,我将要检测怎样利用HTTP在Web浏览器(也可以说成请求客户端)和Web服务器(也可以说成是响应服务器端)之间影响发送到Internet上的内容。首先,我们来进一步研究一下SOAP的处理过程。
SOAP处理样本
在早期的中,有三条内容要发送到服务器中:姓名,年龄和头发的颜色。一条信息被发送回来:通过一句话对这个在表单中的人进行描述。让我们看看下面的例子:
- 一个人:姓名(Jone Doe),年龄(21),头发的颜色(棕色)。
- 用一句话描述成:Jone Doe 是一个深色头发的年轻人。
可以看出非常容易。现在再写一个XML的简单例子分别是发送xml和接受xml:
发送xml:
<person>
<name>John Doe</name>
<age>21</age>
<color>Brown</color>
</person>
接受xml:
<description>
John Doe is a young brunette
</description>
除了在句法中作一些小心的修订之外,SOAP通信在双方都是完整的。正是在语法结构上的规范的正式性才掩饰了SOAP简易朴素的一面。你需要整理(读:把所有的无用的东西放进)这些SOAP信息。
推敲请求响应信息
整体构造信息的主要问题在于,所有的句法结构来自一个非常局限的领域。这些信息并没有被任何暗示说明这些信息是XML,而且当然也没有指明一些标签来说明。那么我们用下面的方法来改进发送的xml信息:
<?xml version="1.0" ?>
<p:person xmlns:p="http://saturn.test.com.au/2002/person">
<p:name>John Doe</p:name>
<p:age>21</p:age>
<p:color>Brown</p:color>
</p:person>
利用xml姓名域(xmlns),我已经把所有的标识符都属于字母”P”,这代表了”http://saturn.test.com.au/2002/person”。如果信息的发送者和接收者都理解所写的意义,那么这条消息就是有意义的。但是这些标识符的简化含义到底来源于哪里呢?
标识符的简化含义被另一个XML文件说明。该文件都是来源于XSchema standard中的标识符。X系统标准是表述新标识符的一种方法,例如象<person>。既然我创建了<person>
标识符,那么我就拥有了一个X系统文件,该文件定义了象<person>这样的标识符所代表的具体含义。这非常容易明了,但是在所有的X系统文件的最后(习惯上是这样的)都附有.xsd文件,而不是.xml文件,.xsd的范围从规则提出的最开始一直到规则结束。因此http://saturn.test.com.au/2002/person 是一个person的.xsd文件,实质上这个文件只是一个XML文件。它看起来就像List A。
程序员建立了XML文件。这个文件又涉及到另外一个XML文件,一个在“http://www.w3.org/2001/XMLSchema.”上的文件。这个文件用标准主体来编写,因此除了每次用该文件来处理一些象person.xsd这样的文件外,他就没什么其它用处了。
X系统定义了第二套必要的标识符。<element>标识符是最重要的。在我的模型中Person.xsd文件用两个<element>标识符去定义<person>和<description>标识符。在这个系统文件中有一个非常细节化的过程,但是要指出的这一点很重要,就是所有的信息标识符都是被定义的,所有的标识符都有类型。例如,<age>标识符是类型为type=”positiveInteger",这表示它只能在<person>标识符中出现。数据类型非常重要,因为SOAP通信通常要传递数据而不是传递格式自由的文本。甚至简单的响应消息(<description>),这是一个格式自由的文本,它都要被一串被定义的字符串所取代。
把请求放入SOAP封装 把请求放入SOAP封装
建一个SOAP消息一个写信和发信的过程。既然你创建了一个SOAP消息,就要把它放到一个SOAP封装中并在前面注明指令。下面是一个SOAP封装的例子:
<Envelope>
<Header> ... </Header>
<Body> ... </Body>
</Envelope>
程序中的图形(三个点)表示要发送的文件在哪里,它要发送到哪里去。当然了,一条XML跟最初的send.xml一样具有滞后性,所以要一点一点清理语法结构:
<?xml version="1.0" ?>
<env:Envelope xmlns:env='http://www.w3.org/2001/12/soap-envelope'>
<env:Header>
</env:Header>
<env:Body>
</env:Body>
</env:Envelope>
这是你所需要的第三套标识符。<Envelope>,<Header>和<Body>标识符(严格的语法格式)都会被SOAP标准列入清单——其中SOAP标准把这几条封装描述成围绕在SOAP周围的数据,即使封装在技术上和数据分开,实际上你还是会试图发送的。这整个的过程就叫做“SOAP 通信”。现在让我们消息放到封装中,如List B 所示。
三个“xmlns”XML的名称域声明了三个简化的标识符,用来通信:两个如上面所示(一个已经被再三重复了),一个在person.xsd文件中。但是<p:control>标识符到底是什么呢?
你可以利用SOAP文体的开头把数据放到封装中。SOAP的“必须理解”属性就是<p:control>标识符对信息的接收者指出,信息必须被整体处理否则将完全失败。<control>标识符是一个新创建的标识符,它就是用来实现上述属性的。把<control>加入到person.xsd系统中,如下面所示:
<schema:element name="control">
<schema:complexType>
</schema:complexType>
</schema:element>
这里有一个X系统的小窍门,从一些内容中提出的<control>标识符——在HTML中可以归并成一个<hr>类。现在SOAP通信才是完整的,如果你对另外的通信进行全面的处理,请你参看List C.
剩下来要做得的就是发送这两条信息。
把SOAP消息连接到HTTP
HTTP是SOAP消息反复发送的结果。他好比一个邮递员手里拿着SOAP信封去目的地一样。如果你想从象Perl,Java,C++这样的程序语言中发送SOAP信息,而它们中又没有浏览器,你就需要了解HTTP报头来实现请求了。下面是你最后用来发送.xml所需要做的:
POST /transactions/AnalysePerson HTTP/1.1
Host: jupiter.test.com.au
Content-Type: application/soap; charset="utf-8"
SOAPAction: "http://saturn.test.com.au/transactions/AnalysePerson"
Content-Length: 447
SOAPAtion 报头是具有随意性的并且有几分欺诈性。他告诉接受系统在没有请求接受端去浏览其内部的情况下怎样去处理引入信息并且对端内容是SOAP内容。如果一个SOAP服务器即将被使用,你只需要判断当报头被提交的时候服务器,是否把这些提交都加载上去了。当然,SOAP通信将这样开始recv.xml报头:
message will start:
HTTP/1.1 200 OK
Content-Type: application/soap; charset="utf-8"
Content-Length: 406
这是因为recv.xml信息在一个HTTP响应中被返回,以便和发送HTTP请求相匹配。
SOAP通信能够被排列组合并且可以被现代的浏览器发送,所以你可能会期待HTTP报头清单更大一点。从浏览器角度看,无论什么报头,都要是完整的,真实的,完全适应象List D这样客户的SOAP请求。
给封装加密
SOAP是一个在程序之间传递信息的系统,而且代码是非常简单易懂的。只要你记住中心的任务是定义加在你所发送的数据之间的结构标识符,剩下的要做的就是象装饰圣诞树那样进行尝试性的加载了。不要被这所困扰。如果你对你的SOAP工作有绝对的信心,那么通过学习SOAP and XSchema standards,你一定会做的最好!
浙公网安备 33010602011771号