A Java Requester of the Web Service
就实现功能而言,示例1-9和前面分别在示例1-5和1-6中,由Perl及Ruby语言实现的客户端相同。
示例1-9:Java语言实现的Web服务客户端
- package ch01.ts;
-
- import javax.xml.namespace.QName;
- import javax.xml.ws.Service;
- import java.net.URL;
- class TimeClient {
- public static void main(String args[ ]) throws Exception {
- URL url = new URL("http://localhost:9876/ts?wsdl");
-
-
-
-
- QName qname = new QName("http://ts.ch01/", "TimeServerImplService");
-
-
- Service service = Service.create(url, qname);
-
-
- TimeServer eif = service.getPort(TimeServer.class);
-
- 示例1-9:Java语言实现的Web服务客户端(续例)
- System.out.println(eif.getTimeAsString());
- System.out.println(eif.getTimeAsElapsed());
- }
- }
这个Java客户端所用到的带有查询字符串的URL地址同前面由Perl和Ruby语言实现的客户端是一样的,不同地是Java客户端明确地创建了一个语法格式为"URI:本地名称"的XML限定名。URI是统一资源定位符(Uniform Resource Identifier)的缩写,和前面经常遇到的URL是有区别的,通常情况下URL需要指定具体的资源位置,而URI不需要。简单地说,一个URI不一定就是一个URL。目前我们只要清楚Java类java.xml.namespace.Qname用来表示一个XML限定名就可以了。在本类中的命名空间URI在WSDL文档中提供,本地名称是SIB的实现类TimeServerImpl名称加上"Service",即:TimeServerImplService。本地名称在WSDL文档最后一段的Service元素中描述。
分别构建好URL和Qname对象后,然后调用Service.create方法,执行如下代码:
- TimeServer port = service.getPort(TimeServer.class);
回想前面的WSDL文档,portType一节所描述的内容,包括在Web服务操作方法中的接口定义风格。getPort方法返回一个Java对象,可以通过此对象调用portType中描述的操作。getPort返回的对象引用是一个ch01.ts.TimeServer实例,也就是前面定义的SEI类型。Java客户端,同Perl客户端一样,调用了这两个服务方法,同时Java底层支持库同Perl和Ruby支持库一样"透明"地产生并处理SOAP消息交换,完成对服务操作方法的成功调用。 |