听说SOAP Action header在SOAP 1.1规范中着实让很多开发者喝了一壶。真的有那么难理解么?我想这应该是由于SOAP有两种很是不一样的使用方式,而SOAP Action主要是被用来支持其中应用较少的一种方式的缘由。在我看来,这种方式也很是有价值。java
让咱们先看看SOAP 1.1规范是怎么定义HTTP SOAP Action header的:工具
SOAP Action HTTP request header被用来标识SOAP HTTP请求的目的地,其值是个URI地址。SOAP发送并步限制格式、URI特征或其必须可解析,那么在这种状况下,发送一个HTTP SOAP请求时,其HTTP客户端必须使用/指明SOAP Action HTTP request header。spa
SOAP Action header的内容能够被用在服务端,诸如:防火墙适当的过滤基于HTTP的SOAP请求消息等场景。SOAP Action header的值为空串("")表示SOAP消息的目的地由HTTP请求的URI标识;无值则表示没有指定这条消息的目的地。code
看了官方的定义,相信你们也迷糊了,迷糊在“目的地”这个词上吧?那么,给它一个准确的说法吧——“肯定执行某一行为的路径”。xml
看一个SOAP消息的例子:对象
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <m:GetLastTradePrice xmlns:m="Some-URI"> <symbol>XYS</symbol> </m:GetLastTradePrice> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
很明显的,这条消息指明了要去执行服务端的“GetLastTradePrice”这个方法,开发者不会对此没有疑问,这样看来,SOAP Action也许显得多余了?blog
然而,在另外一种SOAP消息的发送场景种,却少不了SOAP Action。在这种场景中,SOAP消息并无显示的指定要调用的服务方法名,而是利用低层的传输协议发送(这样的化,通常会被Web services忽视),例如使用HTTP的Post方式发送的SOAP消息。索引
拿AWT组件容器来举个例子吧,咱们知道有不少AWT容器,例如:Panel,Box,Window等等,不少状况下,开发者知道他们建立的泛型容器对象下真正是什么对象。那么,假设下面两段代码里的java.awt.Container对象实际上是一个Box吧:开发
1.io
comp = new TextField( "test" ); java.awt.Container c = Foo.bar(); c.add( comp );
2.
comp = new TextField( "test" ); java.awt.Container c = Foo.bar(); ((java.awt.Panel)c).add( comp );
以上两段代码产生两种不一样的结果。“add()”方法对二者彷佛有着相同的意义,可是在代码2中其被扩展为“做为一个Panel对象去add”。因此很明显的,代码2会抛出一个异常,由于咱们知道这个对象其实是Box,而咱们的代码期待的是Panel。
HTTP POST的意义正如这个例子中的“add()”方法同样,HTTP POST提供一个关于SOAP Action如何被使用的索引;而SOAP Action header的值则应该被用来指明这个“扩展”的目的地——这条SOAP/HTTP消息发送者所期待的处理容器的名称(能够这样理解:即相应的API方法)。那么,正如上面那个AWT例子同样,若是这种期待没有被知足,就会产生一个错误。
注意:在SOAP 1.2规范中,SOAP Action header这个属性被“action”所取代,但其做用和工做原理都没有变化。
有意思的是,在Tibco的EAI工具BW中,使用SOAP服务端活动必须指定SOAP Action属性,若是引用的原始WSDL没有使用这个属性的话,也必须明显的指明;所以,相应的,其客户端也要注意啦——必须为SOAP Action属性填入期待的URI。