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