对WebService "style" "use"消息格式的理解

 前段时间部署了几个WebService接口,发现XFire的services.xml文件有这么两标签,"style"和"use",很好奇他们有什么用处。就去找了些资料。资料不太好找,但基本还是搞清楚了。

简单地说style和use其实是WSDL声明服务是如何绑定到消息协议的。我们知道WSDL是用来描述服务接口的,也是用来告诉客户端该如何生成SOAP消息的。style和use不同,客户端生成的SOAP消息就不一样,服务端的返回的SOAP消息格式也会不一样。这说的比较抽象,不要紧,耐心点看下去。

首先我们要搞清楚,services.xml是XFire这个框架自己的配置文件,跟WSDL是不一样的
XFire关于这两标签的定义如下:
<style>document|rpc|message|wrapped</style>
<use>literal|encoded</use>
事实上XFire的use标签目前只支持literal值。详细可看参考资料[1]。

以上两标签使用的值不一样,XFire为接口动态生成的WSDL就不一样,而WSDL的style只有Document和RPC两种取值,XFire多出来的那几种值其实是一种组合方式,例如wrapped就是Document+wrapped,Document就是Document+nowrapped.

写到这里,老毛病又犯了,懒了,不太想写了,呵呵。下面直接贴一些例子吧:
RPC+Encoded SOAP Message:

<soap:envelope>
    <soap:body>
        <myMethod>
            <x xsi:type="xsd:int">5</x>
            <y xsi:type="xsd:float">5.0</y>
        </myMethod>
    </soap:body>
</soap:envelope>

RPC+Literal SOAP Message

<soap:envelope>
    <soap:body>
        <myMethod>
            <x>5</x>
            <y>5.0</y>
        </myMethod>
    </soap:body>
</soap:envelope>

看出来了没,Encoded和Literal的差别就在于参数类型的定义。
Document nowrapped + Literal SOAP Message:

<soap:envelope>
    <soap:body>
        <xElement>5</xElement>
        <yElement>5.0</yElement>
    </soap:body>
</soap:envelope>

Document wrapped + Literal SOAP Message:

<soap:envelope>
    <soap:body>
        <myMethod>
            <x>5</x>
            <y>5.0</y>
        </myMethod>
    </soap:body>
</soap:envelope>

看到区别了没,一个有方法名,一个没有。

一般情况来说,Document wrapped + Literal是最适用的,这也是大部分框架给出的默认值。
参考资料[2] [3]有相当详细的比较,有兴趣的朋友可以自己去看看。
参考资料:
[1] services.xml Reference
[2] Which style of WSDL should I use?
[3] wsdl:binding "style", "use", and message format


你可能感兴趣的:(对WebService "style" "use"消息格式的理解)