WSDL抽象与具体消息

时间:2014-01-03 08:28:04

标签: java web-services wsdl

我正在学习WSDL from online documentation并且遇到了关于抽象信息和具体信息的定义:

  

消息定义始终被视为抽象定义   消息内容。消息绑定描述了抽象的方式   内容被映射为具体格式。

     

但是,在某些情况下,抽象定义可能与一个或多个绑定非常接近或完全匹配具体表示,因此这些绑定将提供   很少或没有映射信息。

     

但是,相同消息定义的另一个绑定可能需要大量的映射信息。出于这个原因,直到检查绑定才可以   确定消息的“抽象性”。

请帮助我理解上述定义的含义?能否请你提供一些例子。

当我们将邮件称为Abstract时,以concrete条款将其称为WSDL

2 个答案:

答案 0 :(得分:5)

消息部分被认为是抽象的,因为它没有真正定义实际SOAP消息的内容格式化的样子。请查看this IBM article,它可以很好地呈现WSDL中可用的绑定样式之间的差异。

以本文中的示例为例,WSDL契约应该定义类似public void myMethod(int x, float y);的方法,你可以在WSDL契约中声明类似的东西:

<message name="myMethodRequest">
    <part name="x" type="xsd:int"/>
    <part name="y" type="xsd:float"/>
</message>
<message name="empty"/>

<portType name="PT">
    <operation name="myMethod">
        <input message="myMethodRequest"/>
        <output message="empty"/>
    </operation>
</portType>

<binding .../>

在这里,您只需声明消息的预期元素,但您实际上并未在此处定义与此定义匹配的实际SOAP消息的外观。这发生在绑定部分。

WSDL在这里提供RPC / encoded ......

<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:envelope>
    <soap:body>
        <myMethod>
            <x>5</x>
            <y>5.0</y>
        </myMethod>
    </soap:body>
</soap:envelope>

...和文档/文字

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

文档/文字实际上并不完整,因为您还为xsd:intxsd:float创建了自己的类型,并使用此类型而不是这些类型作为您的消息类型:

<types>
    <schema>
        <element name="xElement" type="xsd:int"/>
        <element name="yElement" type="xsd:float"/>
    </schema>
</types>

<message name="myMethodRequest">
    <part name="x" element="xElement"/>
    <part name="y" element="yElement"/>
</message>
<message name="empty"/>

<!-- same port type -->
<portType name="PT">
    ...

<binding ... />

每种方法都有其优点和缺点 - 请查看IBM文章以获取更多信息。由于RPC/encoded的限制和弱点,经常不使用RPC/literaldocument/literal bare - 而是使用文档/文字的修改 - document/literal wrapped。这里所有样式的优点都被抛到一个单一的样式中 - 它的另一个限制是只允许一个<part .../>元素用于消息:

<types>
    <schema>
        <element name="myMethod">
            <complexType>
                <sequence>
                    <element name="x" type="xsd:int"/>
                    <element name="y" type="xsd:float"/>
                </sequence>
            </complexType>
        </element>
        <element name="myMethodResponse">
            <complexType/>
        </element>
    </schema>
</types>
<message name="myMethodRequest">
    <part name="parameters" element="myMethod"/>
</message>
<message name="empty">
    <part name="parameters" element="myMethodResponse"/>
</message>

<!-- again same port type -->

<binding ... />

这会产生如下的SOAP消息:

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

但是,document/literal wrapped实际上并不是WSDL的一部分:

  

在文档/文字样式的消息传递中,存在一种模式   被称为包裹文档/文字。这只是一种模式,而且是   不是WSDL规范的一部分。这种模式在JSR中有提及   224(JAX-WS:基于XML的Web服务的Java API)。 (Source

希望这也能以某种方式解答您的其他问题:12

此外,实际的传输可能发生在不同的协议上,如HTTP,JMS,SMTP,......,正如@Namphibian和@JqueryLearner所解释的那样。这发生在绑定部分中,您可以在其中定义哪些协议和绑定样式(RPCdocument)应用于哪些操作:

<binding type="glossaryTerms" name="b1">
   <soap:binding style="document"
   transport="http://schemas.xmlsoap.org/soap/http" />
   <operation>
     <soap:operation soapAction="http://example.com/getTerm"/>
     <input><soap:body use="literal"/></input>
     <output><soap:body use="literal"/></output>
  </operation>
</binding> 

HTH

答案 1 :(得分:2)

Abstract WSDL包含没有传输协议的消息

具体的WSDl是抽象的WSDl加传输协议

传输协议可能是JMSHTTP