清单 11. RPC 样式的 ErpAddress 消息的 WSDL 定义
…
<wsdl:message name="publishErpAddressServiceRequest">
<wsdl:part name="erpAddress" type="typeIn:ErpAddressType">
<wsdl:documentation>publish employee address data</wsdl:documentation>
</wsdl:part>
</wsdl:message>
…
<wsdl:binding … >
<soap:binding … />
<wsdl:operation name="publishErpAddressService">
<soap:operation style="rpc"/>
<wsdl:input name="erpAddress">
<soap:body use="literal"
namespace="http://someCompany.com/soa/2006-07-01/publishErpAddressService"/>
</wsdl:input>
….
</wsdl:operation>
</wsdl:binding>
尽管 ErpPerson 和 ErpAddress complexType 都可以在 RPC 样式的 WSDL 中引用,但将其定义为没有对应模式元素的 complexType 的做法并不太好,因为 complexType 无法由有效负载进行实例化。
例如,模式中的 ErpPersonType complexType 为 ErpPerson 提供了一个数据类型,包括 lastName, firstName 和 mName。它旨在用于创建以下所示的 XML 有效负载:
清单 12. 示例 ErpPerson 消息有效负载
<ErpPerson>
<lastName>Smith</lastName>
<firstName>John</firstName>
<mName>K</mName>
</ErpPerson>
不过,Venetian Blind 样式的 XML 模式无法用于生成或验证此类有效负载,因为在模式中缺乏匹配的全局元素。为了在这种情况下解决此问题,请同时为 ErpPerson 定义元素和 complexType。
混合模式
您并不必完整地定义以上列出的所有三种模式。可以在需要的情况下混合使用这些模式。例如,某些组件可以定义为元素,而其他的仅定义为 complexType。从 XML 有效负载的角度而言,一个原则是,如果组件需要在 XML 有效负载中进行实例化,则应该将其定义为元素。否则,就可以将其定义为类型。
从 WSDL 的角度而言,如果组件在 Document 绑定样式中使用,则应将其定义为元素。否则就可以将模式组件定义为用于 RPC 绑定的类型。下面列出的模式满足了 WSDL 定义的以下要求:
Document 绑定样式的 Employee 消息
RPC 绑定样式的 Employee 消息
Document 绑定样式的 ErpPerson 消息
RPC 绑定样式的 ErpPerson 消息
Document 绑定样式 ErpAddress 消息
清单 13. 采用混合模式的示例 XSD
<xs:element name="Employee" type="EmployeeType"/>
<xs:complexType name="EmployeeType">
<xs:sequence>
<xs:element ref="ErpAddress"/>
<xs:element ref="ErpAddress"/>
</xs:sequence>
</xs:complexType>
<xs:element name="ErpPerson" type="ErpPersonType"/>
<xs:complexType name="ErpPersonType">
<xs:sequence>
<xs:element name="lastName" type="xs:string"/>
<xs:element name="firstName" type="xs:string"/>
<xs:element name="mName" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="ErpAddress">
<xs:complexType>
<xs:sequence>
<xs:element name="streetNumber" type="xs:string"/>
<xs:element name="streetName" type="xs:string"/>
<xs:element name="suiteNumber" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="stateOrProvince" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
<xs:element name="postalCode" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
就 WSDL 中使用的 XML 模式元素和类型的可访问性而言,混合模式更为灵活。它允许您通过准确遵循在 Web 服务中选择的绑定样式构建 XML 模式。
仅类型
有时候,会仅在 XML 模式中定义全局级别的类型,而不定义任何全局元素。这种类型的模式通常作为基础模式使用,用以封装要在其他模式中引用的数据类型。以下是仅在全局级别包含了 complexType 的 Employee 模式:
清单 14. 仅具有全局级别 complexType 的示例 XSD
<xs:complexType name="EmployeeType">
<xs:sequence>
<xs:element name="ErpPerson" type="ErpPersonType"/>
<xs:element name="ErpAddress" type="ErpAddressType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="ErpPersonType">
<xs:sequence>
<xs:element name="lastName" type="xs:string"/>
<xs:element name="firstName" type="xs:string"/>
<xs:element name="mName" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="ErpAddressType">
<xs:sequence>
<xs:element name="streetNumber" type="xs:string"/>
<xs:element name="streetName" type="xs:string"/>
<xs:element name="suiteNumber" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="stateOrProvince" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
<xs:element name="postalCode" type="xs:string"/>
The corresponding WSDL <message> and <binding> definitions are listed below:on
</xs:sequence>
</xs:complexType>
根据 W3C 和 WS-I BP,此模式对 RPC 样式的 WSDL 定义有效。不过,没有全局元素的模式对 XML 有效负载生成和验证用处不大。
结束语
总而言之,在考虑 Web 服务设计时,需要恰当考虑模式的构造方式。如果 XML 模式要用于 Document 和 RPC 样式的 Web 服务,最好在模式的全局级别同时包含元素和类型。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
相关推荐
-
SAP收购CallidusCloud 与Salesforce竞争
一直被称为后台办公巨头的SAP现在似乎也想在前台办公大展拳脚。 最新的迹象是SAP收购CallidusClou […]
-
API设计如龙生九子 各不相同
IT咨询管理公司CA Technologies对API产业做了个问卷调查,问卷内容涉及API设计风格以及管理部署的新动向。调查结果表明,JSON与XML可谓两分天下。
-
API设计:如何正确开发应用程序接口
在交互组件化软件的世界里,没有比让组件之间以及组件与移动设备和浏览器之间进行连接的应用程序接口(API)更重要的东西了。
-
从头开始实现领域驱动设计
领域描述业务;它是驱动企业的概念和逻辑的集合。如果遵循领域驱动设计(DDD)这一本质,那么领域就是应用程序中最重要的组成部分。