在这种情况下,我的Web服务是一个归档系统,它用来在服务器上保存文件。如果作为一个简单的例子,它的作用是足够的了,但是在实际应用中,你也许需要实现某些功能如FTP。在我的例子里,我创建了一个服务类用来接收一个输入文件并把它保存到服务器上。我还创建了一个客户类可以用它来调用Web服务。
归档服务在一个名为ArchiveService的类中实现。该类只有一个称之为StoreFile的方法,该方法带有两个参数:filename和DataHandle对象。参数filename显然是被传输文件的名字,而DataHandler负责文件内容的传输。清单A给出了创建该类的ArchiveService.java文件。
当StoreFile方法被调用时,保存在DataHandler对象中的输入文件写到服务器上一个特定位置上(本例为C:wsfiles目录)。然后,向客户端发送一个消息说明服务器已经接收到该文件了。
ArchiveClient类比文件归档服务要复杂一些,你可以从清单B中找到它的实现代码。这个类用到了常态的SOAP客户设置(setup)(基于Call对象)。主要的区别在于,我用一个DataHandler来保存文件数据。该文件的内容实际上载入到一个DataSource对象中,该DataSource对象用来建立新的DataHandler。然后,我把DataHandler作为一个参数传递到ArchiveService的StoreFile方法。
由于Java Activation Framework提供了对数据的串行化(serialization)和解串行化(deserialization)的功能并自动将它附加到SOAP消息中去,所以在本例中,DataHandler实现主要的功能。你的文件数据并没有直接用SOAP包装后用XML传递,而是作为对附件的一个引用。整个SOAP请求按照MIME编码方式分成多个部分来发送。第一部分为SOAP封套(envelope),第二部分为附件。基本上它们的格式是相同的,这就使得你可以在电子邮件消息中发送附件。当服务器接收到上述多部分请求时,它会自动找到引用的附件并使其可以用到SOAP服务上。
从我给出的例子中,你可以看出Apache SOAP使得发送文件到Web服务器和从Web服务器中接收文件是多么的容易。尽管我给出的例子可能没有很高的参考价值,但我仍相信你可以在其它更有趣的应用程序中轻松使用这个技术。