缺省地,SOAP::Lite对SOAP请求方法的数据元素进行串并转换,并将它们放到一个通用数组里。这个数组被按照原样传递给请求句柄的子程序。这个子程序就能够访问这些参数,就像它能够访问其他任何带参数的输入一样。这样做就能很容易地为各种服务建立原型,但是其代价是灵活性的降低。如果你的方法有任何可选参数,如果你的方法有任何你需要访问的属性,或者如果传递给方法的参数并不依赖于顺序,那么这种额外的简单性所带来的麻烦要比其带来的好处更多。
SOAP::Lite为你通过名字访问请求中的元素提供了一个更加方便的方法。这增加了可以定义的服务接口类型的灵活性。下面这个例子会告诉你如何实现:
1 #!/usr/bin/perl
2 # Filename: Echo.pm
3 package Echo;
4 use strict;
5 use vars qw(@ISA);
6 @ISA = qw(SOAP::Server::Parameters);
7 sub echo {
8 my $self = shift;
9 my $envelope = pop;
10 my $str = $envelope->dataof("//echo/whatToEcho")->value;
11 return $str;
12 }
13 1;
通过第5和第6行里对SOAP::Server::Parameters包的扩展,你可以通过名字找出SOAP数据元素的分封线。要访问SOAP Body,首先将隐秘地传递给方法的SOAP分封线的对象弹出,然后调用一个dataof()子程序,用以返回对应于指定元素name/XPath的SOAP::Data对象,见第10行。由于dataof()返回的是一个SOAP::Data对象,你就能够访问SOAP::Data的所有子程序,包括value(),name(),type(),uri()和attr()等用于直接访问元素的值、元素的名字、元素的数据类型、元素的uri,以及所有元素各自的属性。