我最近开始使用document-style web-services
。我了解到,通过这种方式,我们只能有一个part
("参数")用于输入/输出消息,它可以包含所有数据
但现在我已经读到了Holders
,根据这个链接,它用于返回多个参数。现在我想知道,如果我可以使用可以包含所有内容的文档样式响应,为什么我要使用Holders
我在这里找到的其他信息仍然让我感到不确定。
我最近开始使用文档风格的web服务。我学到了通过这种方式,我们只能为输入/输出消息,可以包含所有数据。
您必须区分document/literal bare (or unwrapped)
和document/literal wrapped
。对于后一种说法,你的说法是正确的,而对于前一种说法则是错误的。关于特定类型编码的IBM指南,您将看到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
(这是推荐的绑定样式)来绕过bare
绑定样式的限制。
进一步注意,document/literal wrapped
本身并不是实际WSDL规范的一部分:
在文档/文字风格的消息传递中,存在一种模式被称为包装文档/文字。这只是一种模式不是WSDL规范的一部分。JSR中提到了这种模式224(JAX-WS:Java API,用于基于XML的web服务)。(来源)
@编辑:由于您的来源问题以及您对为什么可能使用Handler
的评论:
WSDL指定了IN
、OUT
和INOUT
参数。虽然前两个参数很容易理解,但后者有点棘手,因为发送给服务的参数应该返回修改后的状态。
然而,Java是按值传递的,而不是按引用传递的,为了启用同一参数的更新,类似于按引用传递工作的方式,Handler
s可以用于"伪造"OUT
或INOUT
参数的符合WSDL的处理。
对于一个简单的代码示例和可能更好的解释,请查看一个非常相似的问题及其答案