欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

WebService Soap消息之style和use

程序员文章站 2022-03-17 16:49:22
...

    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消息了吧,在此记录可以在以后忘记了快速找到解决方法.也希望给跟我有同样困惑的人一些提示.

 

 

相关标签: soap webservice