SOAP协议语法拾零现在用JavaScript,HTML和PerlCGI这样的Web技术来解决简易目标访问协议(SOAP)通信原则是可以的。SOAP通信明显的不足在于这些方法没有适当的SOAP句法结构——所以这些是不标准的解决方案。SOAP是XML和HTTPSOAP信息是无格式的老版本XML文件。XML提供了一种句法结构,这种句法结构能让你使用各种不同的标示。代替了html标签,SOAP规则描述了一种envelope标签。为了获得SOAP请求,三套标签是必需的。既然标签都是配套组合的,就要在一个文档中去连接它们。这个文档就是SOAP通信。最后,通信必须被发送到某个地方。当然,你发送的并不是一个信息,而是一对信息:一套请求——应答信息。其中一个是发出“请处理数据”的消息,而另一个时发出“提交我所做的处理”的消息。SOAP规则用HTTP来实现请求——应答通信——发送SOAP数据的过程在登陆Web页上和发送一个表格已经没有什么区别了。稍后,我将要检测怎样利用HTTP在Web浏览器(也可以说成请求客户端)和Web服务器(也可以说成是响应服务器端)之间影响发送到Internet上的内容。首先,我们来进一步研究一下SOAP的处理过程。SOAP处理样本在早期的SOAPicebreakerarticle中,有三条内容要发送到服务器中:姓名,年龄和头发的颜色。一条信息被发送回来:通过一句话对这个在表单中的人进行描述。让我们看看下面的例子:一个人:姓名(JoneDoe),年龄(21),头发的颜色(棕色)。用一句话描述成:JoneDoe是一个深色头发的年轻人。可以看出非常容易。现在再写一个XML的简单例子分别是发送xml和接受xml:发送xml:personnameJohnDoe/nameage21/agecolorBrown/color/person接受xml:descriptionJohnDoeisayoungbrunette/description除了在句法中作一些小心的修订之外,SOAP通信在双方都是完整的。正是在语法结构上的规范的正式性才掩饰了SOAP简易朴素的一面。你需要整理(读:把所有的无用的东西放进)这些SOAP信息。推敲请求响应信息整体构造信息的主要问题在于,所有的句法结构来自一个非常局限的领域。这些信息并没有被任何暗示说明这些信息是XML,而且当然也没有指明一些标签来说明。那么我们用下面的方法来改进发送的xml信息:?xmlversion=1.0?p:personxmlns:p=:nameJohnDoe/p:namep:age21/p:agep:colorBrown/p:color/p:person利用xml姓名域(xmlns),我已经把所有的标识符都属于字母”P”,这代表了””。如果信息的发送者和接收者都理解所写的意义,那么这条消息就是有意义的。但是这些标识符的简化含义到底来源于哪里呢?标识符的简化含义被另一个XML文件说明。该文件都是来源于XSchemastandard中的标识符。X系统标准是表述新标识符的一种方法,例如象person。既然我创建了person标识符,那么我就拥有了一个X系统文件,该文件定义了象person这样的标识符所代表的具体含义。这非常容易明了,但是在所有的X系统文件的最后(习惯上是这样的)都附有.xsd文件,而不是.xml文件,.xsd的范围从规则提出的最开始一直到规则结束。因此,实质上这个文件只是一个XML文件。它看起来就像ListA。程序员建立了XML文件。这个文件又涉及到另外一个XML文件,一个在“”上的文件。这个文件用标准主体来编写,因此除了每次用该文件来处理一些象person.xsd这样的文件外,他就没什么其它用处了。X系统定义了第二套必要的标识符。element标识符是最重要的。在我的模型中Person.xsd文件用两个element标识符去定义person和description标识符。在这个系统文件中有一个非常细节化的过程,但是要指出的这一点很重要,就是所有的信息标识符都是被定义的,所有的标识符都有类型。例如,age标识符是类型为type=”positiveInteger,这表示它只能在person标识符中出现。数据类型非常重要,因为SOAP通信通常要传递数据而不是传递格式自由的文本。甚至简单的响应消息(description),这是一个格式自由的文本,它都要被一串被定义的字符串所取代。把请求放入SOAP封装创建一个SOAP消息一个写信和发信的过程。既然你创建了一个SOAP消息,就要把它放到一个SOAP封装中并在前面注明指令。下面是一个SOAP封装的例子:EnvelopeHeader.../HeaderBody.../Body/Envelope程序中的图形(三个点)表示要发送的文件在哪里,它要发送到哪里去。当然了,一条XML跟最初的send.xml一样具有滞后性,所以要一点一点清理语法结构:?xmlversion=1.0?env:Envelopexmlns:env=''env:Header/env:Headerenv:Body/env:Body/env:Envelope这是你所需要的第三套标识符。Envelope,Header和Body标识符(严格的语法格式)都会被SOAP标准列入清单——其中SOAP标准把这几条封装描述成围绕在SOAP周围的数据,即使封装在技术上和数据分开,实际上你还是会试图发送的。这整个的过程就叫做“SOAP通信”。现在让我们消息放到封装中,如[url=#b]ListB[/url]所示。三个“xmlns”XML的名称域声明了三个简化的标识符,用来通信:两个如上面所示(一个已经被再三重复了),一个在person.xsd文件中。但是p:control标识符到底是什么呢?你可以利用SOAP文体的开头把数据放到封装中。SOAP的“必须理解”属性就是p:control标识符对信息的接收者指出,信息必须被整体处理否则将完全失败。control标识符是一个新创建的标识符,它就是用来实现上述属性的。把control加入到person.xsd系统中,如下面所示:schema:elementname=controlschema:complexType/schema:complexType/schema:element这里有一个X系统的小窍门,从一些内容中提出的control标识符——在HTML中可以归并成一个hr类。现在SOAP通信才是完整的,如果你对另外的通信进行全面的处理,请你参看ListC.剩下来要做得的就是发送这两条信息。把SOAP消息连接到HTTPHTTP是SOAP消息反复发送的结果。他好比一个邮递员手里拿着SOAP信封去目的地一样。如果你想从象Perl,Java,C这样的程序语言中发送SOAP信息,而它们中又没有浏览器,你就需要了解HTTP报头来实现请求了。下面是你最后用来发送.xml所需要做的:POST/transactions/AnalysePersonHTTP/1.1Host:jupiter.test.com.auContent-Type:application/soap;charset=utf-8SOAPAction::447SOAPAtion报头是具有随意性的并且有几分欺诈性。他告诉接受系统在没有请求接受端去浏览其内部的情况下怎样去处理引入信息并且对端内容是SOAP内容。如果一个SOAP服务器即将被使用,你只需要判断当报头被提交的时候服务器,是否把这些提交都加载上去了。当然,SOAP通信将这样开始recv.xml报头:messagewillstart:HTTP/1.1200OKContent-Type:application/soap;charset=utf-8Content-Length:406这是因为recv.xml信息在一个HTTP响应中被返回,以便和发送HTTP请求相匹配。SOAP通信能够被排列组合并且可以被现代的浏览器发送,所以你可能会期待HTTP报头清单更大一点。从浏览器角度看,无论什么报头,都要是完整的,真实的,完全适应象ListD这样客户的SOAP请求。给封装加密SOAP是一个在程序之间传递信息的系统,而且代码是非常简单易懂的。只要你记住中心的任务是定义加在你所发送的数据之间的结构标识符,剩下的要做的就是象装饰圣诞树那样进行尝试性的加载了。不要被这所困扰。如果你对你的SOAP工作有绝对的信心,那么通过学习SOAPandXSchemastandards,你一定会做的最好!ListA?xmlversion=1.0?schema:schemaxmlns:schema=:elementname=personschema:complexTypeschema:sequenceschema:elementname=nametype=schema:string/schema:elementname=agetype=schema:positiveInteger/schema:elementname=colortype=schema:string//schema:sequence/schema:complexType/schema:elementschema:elementname=descriptiontype=schema:string//schema:schemaListB?xmlversion=1.0?env:Envelopexmlns:env=''env:Headerp:controlxmlns:p=''env:mustUnderstand='1'//env:Headerenv:Bodyp:personxmlns:p=:nameJohnDoe/p:namep:age21/p:agep:colorBrown/p:color/p:person/env:Body/env:EnvelopeListC?xmlversion=1.0?env:Envelopexmlns:env=''env:Headerp:controlxmlns:p=''env:mustUnderstand='1'//env:Headerenv:Bodyp:descriptionxmlns:p=:description/en