最近在工作中遇到一个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
分享到:
相关推荐
SOAP 1.1 和 SOAP 1.2 区别详解 ...SOAP 1.1 和 SOAP 1.2 之间的主要区别在于报头信息、SOAPAction 报头行和命名空间的变化。这些变化体现了 SOAP 协议的发展和完善,提高了协议的可读性和可扩展性。
本文将深入探讨如何在.NET应用中访问Java的WebService,并通过SOAP头进行身份验证的过程,这一过程对于实现安全的跨平台通信至关重要。 ### 1. SOAP头在Web服务中的作用 SOAP(Simple Object Access Protocol)是...
3. **SOAP Action**:在HTTP协议中,SOAP Action是一个HTTP头部字段,指明了SOAP消息中要执行的操作。 4. **WSDL(Web Services Description Language)**:这是一个XML格式的规范,用于描述SOAP服务的接口,包括...
3. **构建SOAP请求**:首先,我们需要了解SOAP服务的WSDL(Web Service Description Language)文档,从中可以获取服务的地址、端点以及方法的SOAP Action。然后,我们可以使用`SOAPMessage`对象来创建请求的XML结构...
一个SOAP消息通常由三部分组成:SOAP封装(SOAP Envelope)、SOAP头部(SOAP Header)和SOAP主体(SOAP Body)。SOAP消息是XML编码的,其中SOAP封装是必需的,SOAP头部和主体是可选的。在HTTP上使用SOAP时,SOAP请求...
在IT行业中,SOAP(Simple Object Access Protocol)是一种用于交换结构化信息的标准协议,常用于Web服务。它基于XML,提供了一种在不同应用程序之间交换数据的统一方式。本篇文章将详细探讨如何使用“soap-build”...
1. **创建SOAP请求**:输入服务的URL,选择合适的SOAP动作(Action),并在Body部分编写XML请求内容。这可以手动完成,也可以通过导入WSDL文件自动完成。 2. **发送请求**:点击发送按钮后,工具会将构造好的SOAP...
在Web服务领域,SOAP(Simple Object Access Protocol)是一种基于XML的协议,用于交换结构化和类型化的信息。当涉及到Web Service客户端与服务器之间的交互时,有时需要在SOAP消息中添加额外的信息,例如身份验证或...
在IT行业中,尤其是在Web服务开发领域,SOAP(Simple Object Access Protocol)是一种常见的用于交换结构化信息的协议。它基于XML,常用于实现分布式系统之间的通信。本教程将围绕标题和描述中的关键知识点展开,...
SOAP(Simple Object Access Protocol)是一种轻量级的、基于XML的协议,用于在Web上交换结构化的和类型化的信息。SOAP允许应用程序通过HTTP等传输协议进行通信,这使得它成为跨平台、跨语言的Web服务交互标准。SOAP...
**SOAP(Simple Object Access Protocol)协议**是一种基于XML(Extensible Markup Language)的协议,用于在Web服务中传递结构化和类型化的信息。SOAP允许应用程序通过HTTP、SMTP等传输协议进行通信,使得不同系统...
其中,`SOAPAction`头部用于指定请求的操作类型,而消息体则包含了具体的请求参数。 #### 六、总结 综上所述,SOAP协议作为一种基于XML的标准化通信协议,通过其封装、编码规则及RPC表示等关键部分,为分布式环境...
SOAP消息通常通过HTTP POST方法发送,HTTP头中包含了SOAPAction,用于标识调用的服务操作。 在SOAP消息中,XML名域被用来区分SOAP元素和应用程序特定的元素。例如,`SOAP-ENV`前缀通常与`...
而`laravel-soap`是Laravel的一个扩展包,专门用于处理SOAP(Simple Object Access Protocol)协议,这是一种基于XML的网络通信协议,常用于不同系统间的远程调用和服务交互。 **SOAP协议简介** SOAP是一种轻量级的...
thinkphp内使用soap 把下载的soap解压放到ThinkPHP\Extend\Vendor目录下 名字是soap 调用方法: function test($url,$method,$data){ vendor('soap.class#nusoap'); //从soap目录导class.nusoap.php类文件 $...
例如,`SOAPAction`头部字段用于指示所调用的Web服务操作名称。 #### 六、SOAP与HTTP的结合实例 示例1展示了SOAP消息通过HTTP协议发送的具体格式。其中,`POST /StockQuote HTTP/1.1`行指明了请求的方法和资源路径...
- **SOAPAction头部**: 对于某些WebService来说,SOAPAction是必需的,用于指定要调用的具体方法。 - **字符编码**: 在构造SOAP消息时要注意字符编码问题,确保消息体中的内容与声明的编码一致。 - **异常处理**: 在...
Apache SOAP是Java平台上的一个开源库,用于构建和消费基于SOAP(Simple Object Access Protocol)的Web服务。SOAP是一种XML格式的协议,它允许应用程序通过HTTP或其他传输协议进行远程调用,实现了分布式计算的能力...
optMap.put("soapAction", soapAction==null?"":soapAction); optMap.put("requestMsg", requestMsg); optMap.put("responseMsg", responseMsg); optList.add(optMap); }catch (Exception e) { } } bind...
SOAP(Simple Object Access Protocol)是一种基于XML的协议,用于在Web服务中交换结构化和类型化的信息。它允许分布式计算环境中不同系统之间的应用程序通过HTTP、SMTP等传输协议进行通信。SOAP消息通常包含三部分...