最近在工作中遇到一个SOAP Action的问题,正好拿出来研究一把。
据说SOAPAction header这玩意在SOAP 1.1规范中着实让不少开发者喝了一壶。真的有这么难理解么?我想这应该是因为SOAP有两种非常不同的使用方式,而SOAPAction主要是被用来支持其中应用较少的一种方式的原因。在我看来,这种方式也非常有价值。
让我们先看看SOAP 1.1规范是怎么定义HTTP SOAPAction header的:
SOAPAction HTTP request header被用来标识SOAP HTTP请求的目的地,其值是个URI地址。SOAP发送并不限制格式、URI特征或其必须可解析,那么在这种情况下,发送一个HTTP SOAP请求时,其HTTP客户端必须使用/指明SOAPAction HTTP request header。
SOAPAction header的内容可以被用在服务端,诸如:防火墙适当的过滤基于HTTP的SOAP请求消息等场景。SOAPAction header的值为空串("")表示SOAP消息的目的地由HTTP请求的URI标识;无值则表示没有指定这条消息的目的地。
看了官方的定义,相信大家也迷糊了,迷糊在“目的地”这个词上吧?那么,给它一个准确的说法吧——“确定执行某一行为的路径”。
看一个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也许显得多余了?
然而,在另一种SOAP消息的发送场景中,却少不了SOAP Action。在这种场景中,SOAP消息并没有显示的指定要调用的服务方法名,而是利用底层的传输协议发送(这样的话,一般会被Web services忽视),例如使用HTTP的Post方式发送的SOAP消息。
拿AWT组件容器来举个例子吧,我们知道有很多AWT容器,例如:Panel,Box,Window等等,很多情况下,开发者知道他们创建的泛型容器对象下真正是什么对象。那么,假设下面两段代码里的java.awt.Container对象其实是一个Box吧:
1.
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提供一个关于SOAPAction如何被使用的索引;而SOAPAction header的值则应该被用来指明这个“扩展”的目的地——这条SOAP/HTTP消息发送者所期待的处理容器的名称(可以这样理解:即相应的API方法)。那么,正如上面那个AWT例子一样,如果这种期待没有被满足,就会产生一个错误。
注意:在SOAP 1.2规范中,SOAPAction header这个属性被"action"所取代,但其作用和工作原理都没有变化。
有意思的是,在Tibco的EAI工具BW中,使用SOAP服务端活动必须指定SOAP Action属性,如果引用的原始WSDL没有使用这个属性的话,也必须显示的指明;因此,相应的,其客户端也要注意啦——必须为SOAP Action属性填入期待的URI。OK
分享到:
相关推荐
.NET 访问JAVA的WEBSERVICE使用SOAP头
1,利用java调用soap接口获取天气的信息;2,利用java调用soap一个特定的案例,可按自己的要求修改。
soap资料soap资料soap资料soap资料soap资料
soap的描述 与简单应用 例题与配置
该SOAP协议规范,不是很完整,此中文文档...6.1.1 HTTP头中SOAPAction域 25 6.2 SOAP HTTP应答 26 6.3 HTTP扩展框架 26 6.4 SOAP HTTP举例 26 7. 在RPC中使用SOAP 27 7.1 RPC和SOAP体 27 7.2 RPC和SOAP头 28 8. 附录 28
thinkphp内使用soap 把下载的soap解压放到ThinkPHP\Extend\Vendor目录下 名字是soap 调用方法: function test($url,$method,$data){ vendor('soap.class#nusoap'); //从soap目录导class.nusoap.php类文件 $...
在Web-service 调用SOAP 新增加SOAP的配置信息。用于验证用户信息。
SOAP资料,介绍SOAP协议,想对Soap协议研究了就下了看看
Soap WebService 调试工具
Laravel开发-laravel-soap Soap 协议客户端 肥皂协议客户端
optMap.put("soapAction", soapAction==null?"":soapAction); optMap.put("requestMsg", requestMsg); optMap.put("responseMsg", responseMsg); optList.add(optMap); }catch (Exception e) { } } bind...
POST /WSShakespeare.asmx HTTP/1.1 SOAP 1.1 request: 报头和 xmlns:soap12不一样
本人在网上看了很多都不能很好的解析报文,就算解析也很难使用,我上传的这个里面将可以拼接soap,判断soap是否连接成功,返回接口的信息,再将报文解析,再转成java实体使用
MFC下实现SOAP服务端和SOAP客户端
C++ 开发SOAP服务端和SOAP客户端
调用pb开发的webserver(SOAP 1.2) /* POST /webservice/n_webservice.asmx HTTP/1.1 Host: localhost Content-Type: application/soap+xml; charset=utf-8 Content-Length: length <soap12:Envelope xmlns:xsi=...
6.1.1 The SOAPAction HTTP Header Field 6.2 SOAP HTTP Response 6.3 The HTTP Extension Framework 6.4 SOAP HTTP Examples 7. Using SOAP for RPC 7.1 RPC and SOAP Body 7.2 RPC and SOAP Header 8. ...
支持java端 生成soap-ui的自定义报文,功能和soap-ui软件相似
Extract Soap Body From Soap Message
Soap,为了使开发人员无须学习 SOAP 或 XML 的复杂知识,即可创建并使用Web服务。为了使开发人员无须学习 SOAP 或 XML 的复杂知识,即可创建并使用Web服务