本文介绍如何使用 Web 服务互操作性组织 (Web Services Interoperability Organization) 定义的 XML 附件类型:wsi:swaRef。
引言
IBM developerWorks 发布了多篇介绍各种发送 Web 服务附件的方法的文章(相关链接请参阅参考资料)。本文介绍了另一种机制,即 Web 服务互操作性 (WS-I) 组织的带附件的 SOAP参考类型:wsi:swaRef。
为什么使用 wsi:swaRef?
因为没有针对附件的 XML 类型,因此 WS-I 创建了一个这样的 XML 类型。WSDL 规范包含一个附件定义,但是由于各种原因,该定义存在以下不足:
附件在接口中不可见
只有消息部分才能包含附件
附件与 document/literal 包装的内容不能很好地融合
附件在接口中不可见
附件是在 SOAP 中定义的,而 WSDL 规范将 SOAP 附件映射到 WSDL 绑定。这就意味着 WSDL 文档的接口 部分(portType、messages 和 types)并不能识别附件。
以清单 1 中所示的代码为例。其中的代码摘自“Web 服务编程技巧和诀窍: 使用 JAX-RPC 来传递 SOAP 附件 ”一文(请参阅参考资料)。如果您暂时忽略绑定,而只看 WSDL 的接口,会在其中看到两个操作,即 sendImage 和 sendOctet。每个操作都有一个 hexBinary 输入。JAX-RPC 将 hexBinary 映射到一个 Java byte[]。仅通过该信息就可以合理地猜到,此 WSDL 接口将映射到一个包含两个方法的 Java 接口,其中每个方法都有一个 byte[] 参数。猜的没错,的确如此,但 MIME 类型例外。对于 MIME 类型,必须检查绑定,才能确定真实的参数类型。您将在绑定中看到操作的输入实际上是 MIME 内容类型——图像/jpeg 和应用程序/八进制流——而不是 hexBinary。JAX-RPC 会将其分别映射到 java.awt.Image 和 javax.activation.DataHandler。
对于附件,仅根据 WSDL 接口并不足以确定 Java 接口。这非常不方便。接口与实现之间的界线因此变得模糊了。
清单 1. 带附件的 WSDL——WS-I 的 wsi:swaRef 出现之前
<definitions
targetNamespace=”urn:attachment.tip”
>
<message name=”empty”/>
<message name=”imageMsg”>
<part name=”image” type=”xsd:hexBinary”/>
</message>
<message name=”octetMsg”>
<part name=”octet” type=”xsd:hexBinary”/>
</message>
<portType name=”AttachmentTip”>
<operation name=”sendImage”>
<input message=”tns:imageMsg”/>
<output message=”tns:empty”/>
</operation>
<operation name=”sendOctet”>
<input message=”tns:octetMsg”/>
<output message=”tns:empty”/>
</operation>
</portType>
<binding name=”AttachmentBinding” type=”tns:AttachmentTip”>
<soap:binding style=”rpc”
transport=”http://schemas.xmlsoap.org/soap/http”/>
<operation name=”sendImage”>
<soap:operation soapAction=””/>
<input>
<mime:multipartRelated>
<mime:part>
<soap:body use=”literal”/>
</mime:part>
<mime:part>
<mime:content part=”image” type=”image/jpeg”/>
</mime:part>
</mime:multipartRelated>
</input>
<output>
<soap:body use=”literal”/>
</output>
</operation>
<operation name=”sendOctet”>
<soap:operation soapAction=””/>
<input>
<mime:multipartRelated>
<mime:part>
<soap:body use=”literal”/>
</mime:part>
<mime:part>
<mime:content part=”octet” type=”application/octet-stream”/>
</mime:part>
</mime:multipartRelated>
</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>
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
相关推荐
-
SAP收购CallidusCloud 与Salesforce竞争
一直被称为后台办公巨头的SAP现在似乎也想在前台办公大展拳脚。 最新的迹象是SAP收购CallidusClou […]
-
API设计如龙生九子 各不相同
IT咨询管理公司CA Technologies对API产业做了个问卷调查,问卷内容涉及API设计风格以及管理部署的新动向。调查结果表明,JSON与XML可谓两分天下。
-
API设计:如何正确开发应用程序接口
在交互组件化软件的世界里,没有比让组件之间以及组件与移动设备和浏览器之间进行连接的应用程序接口(API)更重要的东西了。
-
从头开始实现领域驱动设计
领域描述业务;它是驱动企业的概念和逻辑的集合。如果遵循领域驱动设计(DDD)这一本质,那么领域就是应用程序中最重要的组成部分。