Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer

Re^3: SOAP::Transport::HTTP::Daemon and XML

by erroneousBollock (Curate)
on Nov 22, 2007 at 04:05 UTC ( #652301=note: print w/replies, xml ) Need Help??

in reply to Re^2: SOAP::Transport::HTTP::Daemon and XML
in thread SOAP::Transport::HTTP::Daemon and XML

I have the WSDL description, but only in file form.
Are you sure?

Web-services commonly serve their WSDL from the proxy URL with '?WSDL' appended.

The SOAP::Transport::HTTP::Server subclasses don't make it easy to serve your WSDL from the same service, so what I do is the following:

  1. use the HTTP::Request->parse constructor from HTTP::Request to build a request from the raw incoming request, then
  2. (depending on the $request->uri) I either:
    • build a response containing WSDL, or
    • pass $request directly to SOAP::Transport::HTTP::Server like this:

      my $soap = SOAP::Transport::HTTP::Server -> new(%args) -> dispatch_to(@classes); $soap->request($request); $soap->handle; my $response = $soap->response;

Is it necessary that WSDL file be web served? I don't see how to use it as local file, is it possible?
Sure, do something like this:

my $soap = SOAP::WSDL->new(); $soap->wsdl('file:/path/to/file.wsdl'); $soap->proxy('http://server/service.cgi'); $soap->wsdlinit(caching => 1);
Loading from the file saves some time on script startup, using caching saves a lot of work on each request.

Update: Fixed my URLs.


Replies are listed 'Best First'.
Re^4: SOAP::Transport::HTTP::Daemon and XML
by romanovsky (Initiate) on Apr 02, 2008 at 14:44 UTC
    Here is my solution of the task. It isn't very graceful. But it works:
    package My::Net::SOAP::Transport::HTTP::Daemon; use SOAP::Transport::HTTP; use My::Net::SOAP::Transport::HTTP::Server; @SOAP::Transport::HTTP::Daemon::ISA = qw( My::Net::SOAP::Transport::HTTP::Server ); @My::Net::SOAP::Transport::HTTP::Daemon::ISA = qw( SOAP::Transport::HTTP::Daemon ); sub setWsdl($$) { my $self = shift; my $wsdlUri = shift; my $wsdlFile = shift; $/ = undef; open FILE, $wsdlFile or die "Cannot open '$wsdlFile' ($!)"; $My::Net::SOAP::Transport::HTTP::Server::WsdlFileContent = <FILE>; close FILE; $My::Net::SOAP::Transport::HTTP::Server::WsdlURI = $wsdlUri; return 1; } 1; package My::Net::SOAP::Transport::HTTP::Server; use strict; use SOAP::Transport::HTTP; our @ISA = qw( SOAP::Transport::HTTP::Server ); our $WsdlFileContent; our $WsdlURI; sub handle { my $class = shift; my $result; eval { my $self = $class->new; if ($self->request->method eq 'GET') { if( $self->request->uri eq $WsdlURI ) { my $response = $WsdlFileContent; print "FOO:\n"; $result = $self->make_response(undef,$response) || 1; } else { print STDERR "Got GET request with wrong URI '".$self- +>request->uri."'!='$WsdlURI', ignoring"; } } }; if( $@ ) { print STDERR "Runtime error ($@)"; return undef; } return $result if $result; return $class->handle(); } 1; # now use derived Daemon class regular way use My::Net::SOAP::Transport::HTTP::Daemon; my $daemon = My::Net::SOAP::Transport::HTTP::Daemon->new( LocalAddr => 'myhostname', LocalPort => 9999, ) or die "Cannot create My::Net::SOAP::Transport::HTTP::Daemon"; $daemon->setWsdl("/$service?WSDL",'/path/to/file.wsdl') or die "Cannot set WSDL ($@)"; my $dispatcher = $daemon->dispatch_with({ 'urn:/'.$service => 'My::WS: +:'.$service }); my $object = $dispatcher->objects_by_reference("My::WS::".$service); $object->dispatch_to('/my/lib/My/WS', $service); $object->handle;
      What perl packages do we need. is it SOAP lite?

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://652301]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (4)
As of 2021-10-26 09:50 GMT
Find Nodes?
    Voting Booth?
    My first memorable Perl project was:

    Results (90 votes). Check out past polls.