XML::Compile::WSDL11 - accessing the transport layer
mark at overmeer.net
Fri Apr 11 09:37:17 BST 2008
* Toby Corkindale (tjc at wintrmute.net) [080411 05:02]:
> On Fri, Apr 11, 2008 at 12:08:39PM +1000, Toby Corkindale wrote:
> > I'm using XML::Compile::WSDL11 to generate some SOAP services, but I
> > want to get access to the LWP::UserAgent object..
> > Can anyone help me with the missing step here?
> I never did figure out the right way to get to the transport layer, and
> eventually decided that X-C-T-SOAPHTTP just didn't export the package-wide
> %transporters hash via any means.
> I created a work-around, see below if you ever need to do this yourself:
> > my $wsdl = slurp('service.wsdl');
> > my $service = XML::Compile::WSDL11->new($wsdl);
You can also do:
my $service = XML::Compile::WSDL11->new('service.wsdl');
> my $transport = XML::Compile::Transport::SOAPHTTP->new(
> address => $server_uri
The problem is that a WSDL can declare multiple protocols, which may
not be support by one transport implementation, like LWP. For instance,
I already got sucj report about XMPP (Jabber)... not supported by LWP,
but used in WSDL.
So, there cannot be a $service->userAgent method, even though there
may be a global variable which contains it...
> my $ua = $transport->userAgent;
> # Hurrah, now set all your custom LWP::UserAgent options.
> # ...
> my $call = $service->compileClient('MyService',
> port => 'MyPort',
> transport => $transport,
The only way to get your hands on the LWP::UserAgent used for one or
more WSDL operations, is by avoiding the auto-generated internal
objects, but specify them explicitly. So, you approach is sane.
You could also do:
my $ua = LWP::UserAgent->new; # get it somewhere, SSL setup>
my $transporter = XML::Compile::Transport::SOAPHTTP->new(user_agent => $ua);
my $http = $transporter->compileClient(soap => 'SOAP11', ...);
my $call = $wsdl->compileClient('myport', transport => $http);
You can leave-out steps 1, 2, and/or 3 in various combinations, to still
get something working. Each step has its own responsibilities, so may
require configuration. This traject is not documented as a whole yet.
> I welcome any suggestions on easier ways to perform this..
Gladly, you can reuse the objects in all above steps, so probably it
is not too much of a burdon on the whole program when you need to
configure this communication layers in special ways.
Mark Overmeer MSc MARKOV Solutions
Mark at Overmeer.net solutions at overmeer.net
More information about the london.pm