Web service正在作为一种用于构建客户端-应用程序的标准出现,而且您可以使用各种技术来编写它们,包括使用工具包。在各种工具包中,可用于的是Sun Microsystems编写的开源Axis 和JAX-RPC标准实现(参见参考资料)。
我们将集中描述一种用于编写Web service客户端的逐步式方法,该方法使用Sun的JAX-RPC标准实现(JAX-RPC SI)作为其Web service工具包。这个工具包是可靠的,能够生产部署在生成环境中的Web service,后者实质上是JAX-RPC标准的参考实现,而JAX-RPC规范受到了广泛的支持。例如,BEA和IBM都支持JAX-RPC,而且事实上,您可以把一个Sun实现生产的Web service部署到BEA WebLogic中。另外,Sun的实现符合各种其他规范,比如WS-Security,这些规范正在变得越来越重要。您可以用于构建一个Web service客户端的源代码。
要编写一个客户端,您需要一台服务器进行编程。可用的服务器有几种,比如Google或eBay,但是这里我们将使用Amazon的Web service。但是,仅仅知道我们想要使用的服务还不够。我知道Amazon有一个Web service,这个事实并不能让我随心所欲。我需要知道如何调用该Web service。它支持哪些操作?我应该传递哪些参数?我会获得什么返回值?
这些问题说明,要编写一个Web service,必须存在针对该Web service的可用描述。除了客户端/服务器系统之外,服务器也有描述语言,例如,DCOM和CORBA均使用接口定义语言(Interface Definition Language,IDL)。DCOM和CORBA IDL并非同一种语言——也就是说,CORBA客户端无法使用DCOM服务器的IDL来描述对客户端可用的远程服务。
描述服务 通过提供对Web service的描述,Web service描述语言代替了IDL在Web service中的位置。WSDL是一种机器可以使用的XML语法。代码生成器可以读取它。人类也可以读取它,但是它不是使用或者生产起来最容易的语言。我的一个同事Simon Horrell,他喜欢说下面这句话,“WSDL就像太阳。没有它你无法生存,但是如果您盯着它的时间过长,您就会变瞎!”
Amazon提供一个Web service工具包,您可以从Amazon站点它。这个工具包提供针对Amazon Web service的文档,而且它还指定了用于描述Web service的WSDL文档的位置,您也可以在Amazon的站点上找到这些文档。当您打开这份WSDL文档时,如果它看起来十分复杂(它的确也十分复杂),不要过于担心,但是您要明白, 它多多少少提供了对Web service的完整描述。当不需要Amazon工具包时,您将需要一个开发人员令牌(同样可以)。Amazon使用这个令牌来跟踪Web service的使用,并检查是否有滥用服务的情况发生(参见参考资料)。
编写Web service时,您可以采用很多方法,但是这些方法大致可以分为两类。您可以使用所选择的工具包提供的工具来使用WSDL,并生产进行调用的客户端桩;或者您可以使用底层API来手动编写Web service。
使用这两种方法时需要进行权衡。第一种方法(使用WSDL)相对较为容易,但是,它不是很灵活。许多可用的工具会为您做大量的工作。尽管工具易于使用,而且它们生成的代码也易于使用,您可能会发现,这些代码无法完成您想要的全部功能,而且它们的性能可能不够好。例如,您可能需要访问原始的HTTP通信,而生成的代码可能不会让您这样做。
第二种方法较难,但是您可以获得更大的灵活性。从头开始编写代码可能很困难而且耗时,但是这样做最终会获得很好的灵活性和性能。可以通过不同的方式做到这一点:您可以使用 java.net.URL及相关类,或者可以使用java.net.Socket进行低级工作。也可以使用HTTP API,比如Jakarta Commons项目提供的那些API(参见参考资料)。通常,您会使用代码生成工具,而有时候,您可能需要手动地编写客户端的某些特定部分。
向下直到桩 一开始,我们将使用Sun的JAX-RPC SI构建客户端(和服务器)。您可以从Sun的Java开发人员网站上下载Java Web Services Development Pack (JWSDP)(参见参考资料)。您下载并安装了该工具包之后,它包括了JAX-RPC SI。在安装期间,您会被要求选择一台特定的Web服务器。您可以在此处选择下载一台Web服务器,或者不选择Web服务器。
有关安装的细节可以成为另一篇文章的主题了;您只要知道我们将使用%JWSDP-HOME%来指定安装JWSDP的位置就可以了。安装之后,确保您的系统路径中有%JWSDP-HOME%/jaxrpc/bin。这个目录包含了批处理文件和Unix shell脚本,以便运行用作JWSDP一部分的工具。您还可以把%JWSDP_HOME%/jaxb/bin添加到其他工具的路径。
JAX-RPC提供一个可以读取WSDL并生成客户端桩的工具。这些桩是将为我们的代码所用的Java类和接口。这些桩给服务器端功能提供了一个客户端接口。例如,如果我们的服务器提供一个Maths服务,该服务带有一个叫做add的方法。我们的客户端代码将调用桩上的一个方法,而桩实现将对该方法使用参数,把Java方法调用变为Web service请求。这个请求将基于HTTP发送给服务器,而且将使用SOAP作为RPC(参见图1)。
![](/imgfiles/2005.10.7.10.46.22.5.1.gif)
发出一个请求
客户端调用桩上的一个方法,而桩实现对该方法使用参数,把Java方法调用变为将基于HTTP发送给服务器的Web service请求。
客户端调用桩,而桩把调用转换为SOAP消息,然后桩使用RPC发送该消息。监听服务器接收该SOAP消息,然后(十有八九)将其转换为服务器处的一次方法调用。如果服务器是用Java编写的,上述SOAP消息就会被转换为Java调用。如果服务器是服务器,调用将很可能是 或VB对象。服务器的返回值被转换回为SOAP消息,然后返回给桩,而桩会把返回的SOAP消息转换为Java响应。
wscompile工具生成了桩,而且它具有选项加载。对于此种讨论,我们只需要关心运行wscompile生成客户端代码的过程。对于wscompile来说,首要的输入是配置文件(通常叫做config.xml)。wscompile读取这个文件,用于指定一些信息,比如用于生成客户端的WSDL文档的位置。或者,如果我们准备生成服务器,您也可以指定要用于服务器端生成的Java类名。在这种情况下,我们会生成客户端代码,所以配置文件应该包含WSLD位置。
如果您计划遵循这里开发出来的代码,您应该创建一个目录来包含要用到的所有部分,然后在该目录中创建一个src、一个classes和一个etc目录。src目录将包含我们编写的源代码,classes目录将包含编译以后的代码,而etc目录将保存配置信息。我们将在etc目录中创建config.xml文件。
配置元素
文件包含什么内容呢?首先,所有的元素都位于名称空间中。配置元素始终是root元素,而且还有一个wsdl元素,它包含了两个属性:location和packageName。location属性显然是要读取的WSDL文件所在的位置。wscompile使用packageName属性作为用于保存所生成代码的包的名称。位置可以是本地文件或者URL.config.xml。
现在从命令行运行wscompile,同时传递-help标志(参见图2)。正如您看到的那样,有很多可用的标志和特性。现在我们关心的是-gen(或者-gen:client,二者是一样的);-d,告诉wscompile在哪里存放编译以后的文件;还有-s,是生成源代码的位置。您还可以使用-verbose,它让您知道wscompile正在做什么,以及-keep,它指定保存所生成的源文件。您还需要把配置文件作为一个参数传递给wscompile。
![](/imgfiles/2005.10.7.10.46.36.5.2.gif)
特性列表
wscompile 命令有很多可用的标志和特性,您可以通过使用-help标志来查看它们。与这里的讨论有着密切关系的是-gen (或-gen:client)、-d和-s。
[client].sh -verbose -gen -d classes -s src -keep etc/config.xml
这个参数会生成大量的输出,详细描述为Web service生成的代码。wscompile工具生成源代码并将其编译为类。如果没有传递-keep标志,源代码就会丢失。这里有着大量的代码,但是我们只会对客户端使用其中的一小部分。
现在从命令行运行wscompile,同时传递-help标志(参见图2)。正如您看到的那样,有很多可用的标志和特性。现在我们关心的是-gen(或者-gen:client,二者是一样的);-d,告诉wscompile在哪里存放编译以后的文件;还有-s,是生成源代码的位置。您还可以使用-verbose,它让您知道wscompile正在做什么,以及-keep,它指定保存所生成的源文件。您还需要把配置文件作为一个参数传递给wscompile。
[client].sh -verbose -gen -d classes -s src -keep etc/config.xml
这个参数会生成大量的输出,详细描述为Web service生成的代码。wscompile工具生成源代码并将其编译为类。如果没有传递-keep标志,源代码就会丢失。这里有着大量的代码,但是我们只会对客户端使用其中的一小部分。
WSDL文档包含一个服务元素。这个元素提供对Web service的最高级描述——实质上就是它的名称。(WSDL中)一个服务是端口的集合,而端口是对于如何调用服务的高级描述。特别地,端口包含Web service的地址。如果查看生成的类,您将看到两个文件:AmazonSearchService.java和AmazonSearchService_Impl.java。这两个文件分别是一个接口和一个实现类,代表了Am
【责编:admin】
--------------------next---------------------