我有一个现有的Web服务,其complexType为 return 值。
<xs:complexType name="dummy">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="A" type="xs:string" />
</xs:sequence>
</xs:complexType>
稍后(在一些客户端处于生产阶段之后)我想扩展我的Webservice。 详细信息我想添加一个复杂类型的新可选子元素:
<xs:complexType name="dummy">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="A" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="1" name="B" type="xs:string" />
</xs:sequence>
</xs:complexType>
我是否打破现有客户?如果是,那么处理现有Web服务增强功能的正确/通常方法是什么?
答案 0 :(得分:1)
以你的问题文学作为答案是是。
Java客户端基于生成的代码,并且它们验证实际合同是否与生成客户端的合同相匹配。我通过添加新方法破坏了JAX-WS生成的Java客户端的合同 - 理论上这应该不是问题。但我在初始化代码中设置了端点地址。
一些未经验证的客户可以使用已更改的合同,只要它们不符合未知字段即可。在你的情况下,只要你没有显示可选的新元素,它们就会消耗这些消息,但是当消息中存在这样的元素时它们会抛出一个错误(我们的客户端有嗯......好吧..客户端,这是以这种方式运行,他们有旧的定义,但新的字段几乎总是空的 - 而不是XML中的。)
动态生成的客户端(例如在Python中)正在根据当前合同生成响应,并且因为在这些语言中,您可以向现有对象添加新字段,它们将在您的情况下正常工作。
所以答案很长:取决于客户使用合同的内容。
如何管理此类更改:这不是一个好方法,但如果您对使用的客户端和更新时间没有影响,请保留旧的Web服务并在新URL下发布新版本的paralell。