SOAP Action介绍

SOAP Action

  据说SOAP Action header在SOAP 1.1规范中着实让不少开发者喝了一壶。真的有那么难理解么?我想这应该是因为SOAP有两种非常不同的使用方式,而SOAP Action主要是被用来支持其中应用较少的一种方式的原因。在我看来,这种方式也非常有价值。

  让我们先看看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。

  SOAP Action header的内容可以被用在服务端,诸如:防火墙适当的过滤基于HTTP的SOAP请求消息等场景。SOAP Action 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提供一个关于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。

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用 HttpClient 发送 SOAP 请求时,需要在请求头中添加一个 SoapAction 头部,指定所调用的 SOAP 方法。可以使用 HttpClient 的 setHeader 方法来添加 SoapAction 头部,示例代码如下: ```java import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.message.BasicHeader; import org.apache.http.protocol.HTTP; public class SoapClient { public static void main(String[] args) throws Exception { String url = "http://example.com/soap"; String soapAction = "http://example.com/soap/HelloWorld"; // 创建 HttpClient 实例 HttpClient httpClient = HttpClientBuilder.create().build(); // 创建 HttpPost 请求 HttpPost httpPost = new HttpPost(url); // 设置 SoapAction 头部 httpPost.setHeader(new BasicHeader("SOAPAction", soapAction)); // 设置请求体 String requestBody = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" + " <soap:Body>\n" + " <HelloWorld xmlns=\"http://example.com/soap\">\n" + " <name>World</name>\n" + " </HelloWorld>\n" + " </soap:Body>\n" + "</soap:Envelope>"; HttpEntity requestEntity = new StringEntity(requestBody, HTTP.UTF_8); httpPost.setEntity(requestEntity); // 发送请求并获取响应 HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity responseEntity = httpResponse.getEntity(); String responseBody = EntityUtils.toString(responseEntity, HTTP.UTF_8); // 打印响应内容 System.out.println(responseBody); } } ``` 在上面的代码中,我们使用了 setHeader 方法来设置 SoapAction 头部,其参数为一个 BasicHeader 对象,其构造函数接收两个参数:头部名称和头部值。在发送请求时,我们将 HttpPost 对象传递给 HttpClient 的 execute 方法,并获取响应的实体内容。最后,我们把响应实体转换成字符串并打印出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值