SOAP::Lite comes with a handy tool similar to wsdl2java called stubmaker. Run our WSDL through the tool and it generates a Perl module MessageRoutingService.pm. This module wrapps the call to the single RouteMessage API defined in the WSDL. Following code shows how to use this module:
my @dest = ( 
 SOAP::Data->name(protocol=>'jms'),
 SOAP::Data->name(category=>'queue'),
 SOAP::Data->name(server=>'my_jms_server'),
 SOAP::Data->name(port=>'7222'),
 SOAP::Data->name(target=>'my_queue'),
 SOAP::Data->name(user=>'user_a'),
 SOAP::Data->name(password=>'password_a') );
my @content = (SOAP::Data->name(content=>'Hello World'));
my @route_request = (SOAP::Data->name(destination=>\SOAP::Data->value(@dest)),
 SOAP::Data->name(request=>\SOAP::Data->value(@content)));
my $result = MessageRoutingService->RouteMessage(@route_request);
print $result->{content};
Sounds easy? There is a small catch here. The generated stub module needs a little tweak. Somehow it misses the URI namespace for the top method wrapper element .
my %methods = (
 RouteMessage => {
  endpoint => 'http://localhost:8080/common_router',
  soapaction => 'http://www.simple.code/router/action/RouteMessage',
  uri => '',
  parameters => [
   SOAP::Data->new(name => 'document', type => '', attr => {}),
  ],
 },
);
Without the URI, the method in the request looks like
 <RouteMessage xmlns="">
which is obviously wrong. After I manually add the URI in the stub to make it look like
my %methods = (
 RouteMessage => {
  endpoint => 'http://localhost:8080/common_router',
   soapaction => 'http://www.simple.code/router/action/RouteMessage',
   uri => 'http://www.simple.code/router/action/RouteMessage',
   parameters => [
    SOAP::Data->new(name => 'document', type => '', attr => {}),
   ],
  },
);
Now the request becomes
<RouteMessage xmlns="http://www.simple.code/router/action/RouteMessage">
and it is happily accpted by the Java Axis server.
No comments:
Post a Comment