第2章全面了解WSDL
All About WSDLs
2.1 WSDL在Web服务中的作用
What Good Is a WSDL?
在基于SOAP协议的Web服务中,WSDL的主要作用就是对服务契约定义的描述,通过前面的例子已经很好地说明了这点。TimeServer服务的Java客户端在调用Service.create方法时传递了两个参数:一个URL,用来定位服务的访问入口;一个是XML限定名(XML-qualified,在Java中通常是一个Java Qname对象),由服务的本地名称(在上面的例子中是TimeServerImplService)和命名空间标示符(本例中是URL:http://ts.ch01/)组合而成。下面是去掉注释后的代码:URL url =newURL("http://localhost:9876/ts?wsdl");
QName qname =newQName("http://ts.ch01/","TimeServerImplService");
Service service = Service.create(url, qname);
要注意自动产生的命名空间地址(URI)通常是将服务实现Bean(SIB)所在包的名称颠倒过来表示。在本例中包名称"ch01.ts"颠倒过来后在服务的URI中变成了"ts.ch01"。还有一点需要特别留意,如果***个参数被写成了"http://ch01.ts/",TimeClient将会抛出一个Java异常,指出由服务自动产生的WSDL文档中没有定义该(端点)地址所请求的服务。这样开发人员不得不通过检查WSDL文档来确定不是很明确的命名空间地址!同时,在URI中,结尾处的"/"也要特别留意。比如像URL地址"http://ts.ch01",如果不是以"/"结尾,客户端程序TimeClient也会抛出和URL写为"http://ch01.ts/"时同样的异常。
当然还可以通过修改前一章由Perl语言实现的客户端来演示这个问题,修改后的Perl客户端不再请求WSDL文档,而是直接访问Web服务。如示例2-1所示。
示例2-1:针对TimeServer改进后的Perl语言客户端#!/usr/bin/perl -w
use SOAP::Lite;
my $endpoint ='http://127.0.0.1:9876/ts'; # endpoint
my $uri ='http://ts.ch01/'; # namespace
示例2-1:针对TimeServer改进后的Perl语言客户端(续例)
my $client = SOAP::Lite->uri($uri)->proxy($endpoint);
my $response = $client->getTimeAsString()->result();
print $response,"\n";
$response = $client->getTimeAsElapsed()->result();
print $response,"\n";
示例2-1中的Perl语言客户端功能上同修改前是一致的。然而,其中的Perl客户端必须指定服务的命名空间地址http://ts.ch01/。而如果指定为其他任何地址则将无法执行,因为这同 Java产生的WSDL文档中指定的URI不一致。实际上,要使一个Web服务可以正确地被访问,需要提供一个服务端点(URL)和一个命名空间(URI)。示例2-1中的Perl客户端相对前面最初的那个Perl客户端而言,编写起来相对不是那么容易。其中的Perl客户端要求程序员不仅仅要知道服务端点的URL,还需要了解服务的命名空间URI,而修改前的Perl客户端通过直接请求包括服务命名空间的WSDL文档避开了这个问题。也就是说,修改前的那个Perl客户端通过WSDL文档获得服务的URI,这样做更简单些。
点赞 0