Cha*_*nya 2 java wsdl web-services
我正在从在线文档中学习WSDL,并且遇到了关于抽象消息和具体消息的定义:
消息定义始终被视为消息内容的抽象定义.消息绑定描述了抽象内容如何映射到具体格式.
但是,在某些情况下,抽象定义可能与一个或多个绑定非常接近或完全匹配具体表示,因此这些绑定将提供很少或没有映射信息.
但是,相同消息定义的另一个绑定可能需要大量的映射信息.出于这个原因,直到检查绑定,才能确定消息的"抽象程度".
请帮我理解上面的定义是什么意思?能否请你提供一些例子.
当我们把一个消息Abstract
,当它被称为concrete
的WSDL
条款?
消息部分被认为是抽象的,因为它没有真正定义实际SOAP消息的内容格式化的样子.请看一下这篇IBM文章,该文章在介绍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 .../>
Run Code Online (Sandbox Code Playgroud)
在这里,您只需声明消息的预期元素,但您实际上并未在此处定义与此定义匹配的实际SOAP消息的外观.这发生在绑定部分.
WSDL在这里提供RPC /编码...
<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>
Run Code Online (Sandbox Code Playgroud)
... RPC/literal ...
<soap:envelope>
<soap:body>
<myMethod>
<x>5</x>
<y>5.0</y>
</myMethod>
</soap:body>
</soap:envelope>
Run Code Online (Sandbox Code Playgroud)
......和文件/文字
<soap:envelope>
<soap:body>
<xElement>5</xElement>
<yElement>5.0</yElement>
</soap:body>
</soap:envelope>
Run Code Online (Sandbox Code Playgroud)
文档/文字实际上并不完整,因为您还为其创建了自己的类型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 ... />
Run Code Online (Sandbox Code Playgroud)
每种方法都有其优点和缺点 - 请查看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 ... />
Run Code Online (Sandbox Code Playgroud)
这会产生如下SOAP消息:
<soap:envelope>
<soap:body>
<myMethod>
<x>5</x>
<y>5.0</y>
</myMethod>
</soap:body>
</soap:envelope>
Run Code Online (Sandbox Code Playgroud)
但是,document/literal wrapped
它实际上不是WSDL的一部分:
在文档/文字样式的消息传递中,存在一种称为wrapped-document/literal的模式.这只是一种模式,并不是WSDL规范的一部分.在JSR 224(JAX-WS:基于XML的Web服务的Java API)中提到了这种模式.(来源)
此外,实际的传输可能发生在不同的协议上,如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>
Run Code Online (Sandbox Code Playgroud)
HTH
归档时间: |
|
查看次数: |
3595 次 |
最近记录: |