只有消息部分才能包含附件
请注意,在清单 1 中,绑定将一个 MIME 类型与一个消息部分进行了关联。这意味着所有附件必须是部分;例如,您不能将附件定义为 complexType 元素。这样的方法限制性很强,使附件的可用性降到了最低。
附件与 document/literal 包装模式
第三个问题是附件不符合行业当前对 WSDL 的 document/literal 包装模式的习惯用法。有些人认为附件完全不适合 document/literal 包装模式。我并不这样认为,但是无论我怎样想,目前尚没有任何规范尝试过让附件适应 document/literal 包装模式。
问题在于,在 document/literal 包装模式中,一条消息中只有一个部分,而部分必须引用一个 wrapper 元素。附件部分如何适应这个模型呢?它并不能适应。只有放宽对消息中可包含内容的规定,它才能够 适应,但是目前没有任何人尝试过正式地放宽此规定。
WS-I 的解决方案
WS-I 通过创建 XML 附件类型解决了所有这些问题。wsi:swaRef 在 WSDL“接口”中可见。wsi:swaRef 的位置并不局限于消息部分中,也可以为 complexType 元素。作为 XML 类型,wsi:swaRef 能很好地适应 document/literal 包装模式(此模式要求参数是 complexType 元素)。清单 2 是清单 1 的修改版本,其中使用 wsi:swaRefs 代替了标准的附件。请注意,我们还将清单 2 的 WSDL 转换为 document/literal 包装的 WSDL 了。
清单 2. 使用 WS-I 的 wsi:swaRef 附件类型的 WSDL
<definitions
targetNamespace=”urn:attachment.tip”
>
<types>
<schema
targetNamespace=”urn:attachment.tip”
>
<import
namespace=”http://ws-i.org/profiles/basic/1.1/xsd”
schemaLocation=”http://ws-i.org/profiles/basic/1.1/xsd”/>
<element name=”sendImage”>
<complexType>
<sequence>
<element name=”image” type=”wsi:swaRef”/>
</sequence>
</complexType>
</element>
<element name=”sendImageResponse”>
<complexType>
<sequence/>
</complexType>
</element>
<element name=”sendOctet”>
<complexType>
<sequence>
<element name=”octet” type=”wsi:swaRef”/>
</sequence>
</complexType>
</element>
<element name=”sendOctetResponse”>
<complexType>
<sequence/>
</complexType>
</element>
</schema>
</types>
<message name=”imageMsg”>
<part name=”parameters” element=”tns:sendImage”/>
</message>
<message name=”imageResponseMsg”>
<part name=”return” element=”tns:sendImageResponse”/>
</message>
<message name=”octetMsg”>
<part name=”parameters” element=”tns:sendOctet”/>
</message>
<message name=”octetResponseMsg”>
<part name=”return” element=”tns:sendOctetResponse”/>
</message>
<portType name=”AttachmentTip”>
<operation name=”sendImage”>
<input message=”tns:imageMsg”/>
<output message=”tns:imageResponseMsg”/>
</operation>
<operation name=”sendOctet”>
<input message=”tns:octetMsg”/>
<output message=”tns:octetResponseMsg”/>
</operation>
</portType>
<binding name=”AttachmentBinding” type=”tns:AttachmentTip”>
<soap:binding style=”document”
transport=”http://schemas.xmlsoap.org/soap/http”/>
<operation name=”sendImage”>
<soap:operation soapAction=””/>
<input>
<soap:body use=”literal”/>
</input>
<output>
<soap:body use=”literal”/>
</output>
</operation>
<operation name=”sendOctet”>
<soap:operation soapAction=””/>
<input>
<soap:body use=”literal”/>
</input>
<output>
<soap:body use=”literal”/>
</output>
</operation>
</binding>
<service name=”AttachmentService”>
<port name=”AttachmentTip” binding=”tns:AttachmentBinding”>
<soap:address
location=”http://localhost:9080/attachment/services/AttachmentTip”/>
</port>
</service>
</definitions>
从清单 2 可以看到,定义 wsi:swaRef 非常简单。其行为方式与其他基本 XML 类型相似。但在我看来,它过于简单了。与标准附件不同的是,并不知道附件的 MIME 类型。您只知道有一个附件。如果 WS-I 定义 wsi:swaRef 具有特定属性(例如,提供 MIME 类型的属性),将会更有用;但是 WS-I 并不负责定义规范,而只是对相关内容进行阐明,因此在并不定义任何新内容时,会尽可能使其保持最小。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
相关推荐
-
SAP收购CallidusCloud 与Salesforce竞争
一直被称为后台办公巨头的SAP现在似乎也想在前台办公大展拳脚。 最新的迹象是SAP收购CallidusClou […]
-
API设计如龙生九子 各不相同
IT咨询管理公司CA Technologies对API产业做了个问卷调查,问卷内容涉及API设计风格以及管理部署的新动向。调查结果表明,JSON与XML可谓两分天下。
-
API设计:如何正确开发应用程序接口
在交互组件化软件的世界里,没有比让组件之间以及组件与移动设备和浏览器之间进行连接的应用程序接口(API)更重要的东西了。
-
从头开始实现领域驱动设计
领域描述业务;它是驱动企业的概念和逻辑的集合。如果遵循领域驱动设计(DDD)这一本质,那么领域就是应用程序中最重要的组成部分。