SOAP Action揭密

本文探讨了SOAP Action在SOAP 1.1规范中的作用,解释了它如何用于标识HTTP SOAP请求的目的地,并通过实例说明了在没有明确指定服务方法名的情况下的重要性。在SOAP 1.2中,SOAPAction被"action"取代,但其核心功能保持不变。在实际应用如Tibco BW中,正确设置SOAP Action对于服务调用至关重要。
部署运行你感兴趣的模型镜像

最近在工作中遇到一个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

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### SOAPAction 的定义与作用 SOAPAction 是 HTTP 协议头中的一个字段,用于指定 SOAP 请求的操作类型[^1]。它的主要目的是向服务器提供关于请求消息意图的信息,在某些情况下帮助服务器决定如何处理该请求。尽管现代 Web 服务开发中更倾向于通过分析 SOAP 消息的内容来判断操作类型,但在早期实现中,SOAPAction 被广泛用来预判请求的目的。 #### 使用场景 当客户端发送 SOAP 请求到服务器时,可以通过设置 `SOAPAction` 头部告知服务器即将执行的具体操作。例如: ```http POST /wsdl/service.asmx HTTP/1.1 Host: example.com Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: http://example.org/GetWeatherInfo ``` 在此示例中,`SOAPAction` 值为 `http://example.org/GetWeatherInfo`,表示此请求旨在调用名为 `GetWeatherInfo` 的特定方法[^2]。 需要注意的是,虽然 WSDL 文件可能建议使用某个特定的 URI 作为 SOAPAction 值,但这并非强制性的标准行为;许多框架会忽略这个头部并仅依赖于实际的消息体解析逻辑。 #### 编程实践中的应用实例 以下是 Python 中利用 `requests` 库模拟带有 SOAPAction 的 POST 请求的一个简单例子: ```python import requests url = 'https://www.example.com/wsdl/service' headers = { 'Content-Type': 'text/xml;charset=UTF-8', 'SOAPAction': 'http://tempuri.org/IWSService/GetData' } body = """<?xml version="1.0" encoding="utf-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/"> <soapenv:Header/> <soapenv:Body> <tem:GetData> <!--Optional:--> <tem:value>?</tem:value> </tem:GetData> </soapenv:Body> </soapenv:Envelope>""" response = requests.post(url, data=body, headers=headers) print(response.text) ``` 上述脚本展示了怎样构建包含适当 SOAPAction 的 HTTP 请求去交互远程 SOAP web service[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值