我最近开始使用文档风格的网络服务
。
我了解到,通过这种方式我们可以只有一个 part
("parameter") 用于输入/输出消息,它可以包含所有数据。
但现在我已经阅读了关于 Holders
的内容,根据 this链接,用于返回多个参数。
现在我想知道,如果我可以使用可以包含所有内容的文档式响应,为什么还要使用 Holders?
我找到的其他信息 here仍然让我不确定。
最佳答案
I've started to use document-style web-services recently. I've learned that in this way we can have only one part("parameter") for input/output message, which can contain all data.
您必须区分 document/literal bare(或未包装)
和 document/literal wrapped
。对于后一种说法,您的说法是正确的,而对于初级说法,它是错误的。关于an IBM guide for the specific type encodings你会看到 document/literal bare
可以指定多个 part
元素:
<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"/>
<portType name="PT">
<operation name="myMethod">
<input message="myMethodRequest"/>
<output message="empty"/>
</operation>
</portType>
这会导致 SOAP 消息:
<soap:envelope>
<soap:body>
<xElement>5</xElement>
<yElement>5.0</yElement>
</soap:body>
</soap:envelope>
然而,其中一个主要缺点是您会丢失有关所调用方法的信息 - 除了不符合 WS-I 之外。因此,使用document/literal wrapped
(这是推荐的绑定(bind)样式)来绕过bare
绑定(bind)样式的限制。
进一步注意 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)
@Edit:由于你的起源问题和你关于为什么你可能使用 Handler
s 的评论:
WSDL 指定IN
、OUT
和INOUT
参数。虽然前两个参数很容易理解,但后者有点棘手,因为发送到服务的参数应该与修改后的状态一起返回。
但是,Java 是按值传递而不是按引用传递,并且允许更新相同的参数,类似于按引用传递的方式,Handler
可用于“伪造”符合 OUT
或 INOUT
参数的 WSDL 处理。
有关简单的代码示例和可能更好的解释,请 have a look at a very similar question and its answer
关于java Holder vs document-style,或者为什么要使用Holders,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20729694/