WebService Soap消息之style和use

    use属性可以为literal,encoded;
    style可以为rpc,document.

    我们来对五种类型的style/use决定的 binding作一比较,

    分别是rpc/literal,

             document/literal none-wrapper,

             document/literal with wrapper,
             rpc/encoded, 

             document/encoded。


从生成soap消息的角度看
rpc和document的差别在于方法的操作名是否出现在生成的Soap消息中。
literal和encoded编码方式的差别在于参数类型是否出现在生成的Soap消息中。


rpc/encoded能够完整地表示一个方法调用,但性能很差,而且不能校验Soap消息的有效性。
rpc/literal不对参数类型进行编码,但仍然无法对Soap消息进行校验。
document/encoded没有意义,因为没有方法名,对参数类型编码没有什么意义。
document/literal none-wrapper无法生成操作名,适用于完整的文档作为参数传递给方法的场景。
document/literal with wrapper应该是目前使用最多的方式。

先看一段Soap消息:

<soapenv:Envelope 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:jax="http://jaxws.webserver.siyaa.cn/">

   <soapenv:Header/>
   <soapenv:Body>
      <jax:Call>
         <operation>?</operation>
      </jax:Call>
   </soapenv:Body>
</soapenv:Envelope>

 如果我们只做一个客户端去封装这样一个saop消息,那么对于以上五中组合有什么区别呢?

    抱着这个疑问本人一一测试,最终发现

document/literal none-wrapper

   组合的soap消息跟其它的不一样,其对应消息应该是

<soapenv:Envelope 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:jax="http://jaxws.webserver.siyaa.cn/">
   <soapenv:Header/>
   <soapenv:Body>
      <jax:Call>
         <jax:operation>?</jax:operation>
      </jax:Call>
   </soapenv:Body>
</soapenv:Envelope>

    细心的人应该可以发现 请求参数operation前面多了一个前缀,若没有此前缀则会找不到参数.

    wsdl中的style 和use 可以很容易的获得,但是 wrraped 和 bare的是如何区分的呢?

   

    这个区分不是很明显,不仔细看是发现不了的:

    wrraped的输入元素的名称与操作名称相同,bare的不同. 另外bare的请求参数只能有一个.

    就这么简单...

   

    OK,现在可以根据wsdl文件轻松组装自己的soap消息了吧,在此记录可以在以后忘记了快速找到解决方法.也希望给跟我有同样困惑的人一些提示.

猜你喜欢

转载自gy090028.iteye.com/blog/2104549