gpt4 book ai didi

java - WSDL 抽象消息与具体消息

转载 作者:行者123 更新时间:2023-12-02 14:11:27 24 4
gpt4 key购买 nike

我正在了解 WSDL from online documentation并遇到了关于抽象消息和具体消息的定义:

Message definitions are always considered to be an abstract definitionof the message content. A message binding describes how the abstractcontent is mapped into a concrete format.

However, in some cases, the abstract definition may match the concrete representation very closely or exactly for one or more bindings, so those binding(s) will supplylittle or no mapping information.

However, another binding of the same message definition may require extensive mapping information. For this reason, it is not until the binding is inspected that one candetermine "how abstract" the message really is.

请帮我理解上面的定义是什么意思?您能否提供一些相同的示例。

WSDL术语中,什么时候我们将消息称为Abstract,什么时候将其称为concrete

最佳答案

消息部分被认为是抽象的,因为它并没有真正定义实际 SOAP 消息的内容格式。请查看this IBM article它很好地展示了 WSDL 中可用绑定(bind)样式之间的差异。

以本文中的示例为例,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 消息的外观。这发生在绑定(bind)部分。

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>

...RPC/文字...

<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/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 的一部分:

In document/literal style of messaging, there exists a pattern which is known as wrapped-document/literal. This is just a pattern, and is not a part of WSDL specification. This pattern has a mention in JSR 224 (JAX-WS: Java API for XML based web services). (Source)

希望这也能以某种方式回答您的其他问题:1 , 2

此外,实际传输可能发生在不同的协议(protocol)上,如 HTTP、JMS、SMTP 等,正如 @Namphibian 和 @JqueryLearner 已经解释的那样。这发生在绑定(bind)部分,您可以在其中定义哪些操作应使用哪种协议(protocol)和绑定(bind)样式( 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

关于java - WSDL 抽象消息与具体消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20899520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com