我正在学习WSDL from online documentation并且遇到了关于抽象信息和具体信息的定义:
消息定义始终被视为抽象定义 消息内容。消息绑定描述了抽象的方式 内容被映射为具体格式。
但是,在某些情况下,抽象定义可能与一个或多个绑定非常接近或完全匹配具体表示,因此这些绑定将提供 很少或没有映射信息。
但是,相同消息定义的另一个绑定可能需要大量的映射信息。出于这个原因,直到检查绑定才可以 确定消息的“抽象性”。
请帮助我理解上述定义的含义?能否请你提供一些例子。
当我们将邮件称为Abstract
时,以concrete
条款将其称为WSDL
?
答案 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:int
和xsd: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/literal
和document/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)
此外,实际的传输可能发生在不同的协议上,如HTTP,JMS,SMTP,......,正如@Namphibian和@JqueryLearner所解释的那样。这发生在绑定部分中,您可以在其中定义哪些协议和绑定样式(RPC
或document
)应用于哪些操作:
<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加传输协议
传输协议可能是JMS
或HTTP