| |
在写这篇文章的时候,大多数的web服务由简单的信息交换组成:客户端连接到web服务器端,并发送一条消息给服务端。web服务端处理客户端的请求并发送回应给客户端。这个简单的请求/回应模式,模拟了http协议帮助客户端/服务器端交互的过程。同样由于http,web服务信息的交换经常必须包含二进制的内容。比如图像,文档或者声音片段。这篇文章介绍了使用saaj1.2(soap with attachements api for java 1.2)来发送和接收二进制内容web信息。 在深入到传送二进制web服务内容的复杂机制前,值得指出的是:简单的请求/回应类型的web服务,与客户端/服务器端的远程过程调用(rpc)方式不同。在rpc中,服务器给出一个类似api的接口。而客户端通过使用远程调用服务的api,传递必要的参数和接收调用值来启用一个服务。 基于xml的rpc调用类似在oo系统中调用一个对象一样。事实上,当你用基于xml的java api工作时(java api for xml-based rpc简jax-rpc),你总是觉得在跟java对象工作,而不是跟xml文档工作。jax-rpc能让你把web服务看作远程对象,这很像java rmi(remote method invocation)。jax-rpc运行时把高层次的oo方法调用转化为远程web服务需要xml文档。虽然rpc类型的web服务通常能提供更便捷的编程模型,但是rpc调用也必须依赖更低的消息层来完成组成远程调用xml信息交换。 对于有些web服务来说,直接在低级别的消息层编程通常是很有用的。例如,如果你想调用一个处理订单的文档并返回收据,对这样的web服务,你能够很容易地把文档交换模块化为一个请求/回应的信息交换。替代远程方法调用的是,你将构建xml信息,直接发送这些信息到web服务,如果有的话,还会处理服务的xml回应。由于soap为web信息服务定义了公共的信息格式,你需要构建符合soap格式的信息,并且,一旦服务有回应,就要把这些soap回应信息解析成你的程序所能理解的格式。 saaj提供了一个能方便地构建和读取soap信息的库,这个库还允许你通过网络接收和发送soap信息。saaj定义了javax.xml.soap包。在这个包里面的类组成了最初的jaxm(java api for xml messaging),但是最近他们被分离出来成为单独的api。jaxm依赖于saaj来构建和处理soap信息,并且依赖saaj来增加信息的可靠性和增加其他的xml信息特征。尽管saaj是j2ee的一部分,jaxm却不是。这篇文章聚焦于saaj中最有用的一个方面:就是saaj捆绑二进制内容到soap信息的能力。 使用附件的好处 尽管soap的设计核心集中在信息中封装xml文档,但是,soap的附件特征扩展了soap所能包含的信息,除了普通的soap部分,还可以包括0个到多个附件,如图1所示。每一个附近都由一个mime类型定义,并且能采用任何的二进制流内容。  图1:带有附件的soap信息 当客户端希望传送二进制数据的时候,soap的附件特征是非常有用的,比如传送图像,音频数据给一个web服务。如果没有soap附件,发送一个二进制信息会困难很多。比如,一个客户端的soap信息传送二进制文件的url地址。那么,客户端不得不操作一个http服务器,来让web服务找到这个二进制文件。这会给web服务的客户端造成过度的负载,特别是当客户端运行在资源有限的设备中,比如数码相机或者扫描仪。soap的附件能力使得任何的web服务客户,能够在soap信息里直接传送内嵌二进制文件的soap信息。 soap附件,已被证明能很方便地与网络站点入口交互。考虑这样一个现实中的房产代理网络,它需要发送房子的介绍和照片到房产查询中心入口。如果这个入口操作一个servlet来让带附件的soap信息置入,一个房产代理可以用几个soap信息更新它的列表,包括这些房子的照片。soap信息体可能嵌入了房子所有权的介绍,并且soap附件能带有房子图片文件。在这样的情况下,当一个入口操作servlet接收了这种信息,它就能返回一个认证文档,表明了在入口的发布的有效性。图2说明了这样的一个web服务。  房产代理的web服务,使用了带附件的soap信息
|
|