Perhaps I'm missing something in what you're trying to do, but you might
try Apache::SOAP.  Apache::SOAP makes it super-easy to call perl
subroutines running under mod_perl.

I have something like this in my apache config, which maps requests to a
Perl module:

    <Location "/soaptest">
        SetHandler perl-script
        PerlHandler Apache::SOAP
        PerlSetVar dispatch_to "Some::Module"
    </Location>

and then, my module:

        package Some::Module;

        sub add {
                my ($val1, $val2) = @_;
                my $result = $val1 + $val2;
                return $result;         
        }
        
        sub subtract {
                my ($val1, $val2) = @_;
                my $result = $val1 - $val2;
                return $result;         
        }
        1;

Nothing necessarily SOAP specific there.

With that code, I can call these subroutines with client code that looks
like:

        use SOAP::Lite;
        use strict;
        my $soap = SOAP::Lite
            -> proxy('http://my.server.com/soaptest')
            -> uri('Some/Module');
        
        my $result1 = $soap->add( 2 , 4 );
        
        print "2 + 4 = $result1 \n";
        
        my $result2 = $soap->subtract( 4 , 2 );
        
        print "4 - 2 = $result2 \n";


This way you don't need to deal with all of the SOAP::Transport details,
etc.

--Colin




On Mon, 2004-09-27 at 11:30, Ken Miller wrote:
> A few years back, I had played around with SOAP and mod_perl - 
> everything worked fine, but for various reasons I ended up not using 
> SOAP.  I'm back looking at it, and I'm running into a problem I don't 
> remember having before.
> 
> Here's the script I'm running:
> 
>     my $sl = SOAP::Lite-> proxy( 'http://localhost:7070/soaptest',
>                                  cookie_jar => $cookie_jar )
>             -> uri( '/soaptest' )
>             -> on_debug([EMAIL PROTECTED]);
> 
>     $sl->Runner( SOAP::Data->name( blotto => 'foobarius' ) );
> 
>     print $sl->result, "\n";
> 
> Here's the request posted to the server (server names changed to protect 
> the innocent):
> 
> POST http://localhost:7070/soaptest
> Accept: text/xml
> Accept: multipart/*
> Content-Length: 499
> Content-Type: text/xml; charset=utf-8
> SOAPAction: "/soaptest#runner"
> 
> <?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope 
> xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/";
> SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
> xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/";
> xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance";
> xmlns:xsd="http://www.w3.org/1999/XMLSchema";><SOAP-ENV:Body><namesp1:runner 
> xmlns:namesp1="/soaptest"><blotto 
> xsi:type="xsd:string">foobarius</blotto></namesp1:runner></SOAP-ENV:Body></SOAP-ENV:Envelope>
> 
> The /soaptest URI causes this code to be executed on the server:
> 
> package Test::SoapServer;
> 
> use strict;
> use SOAP::Transport::HTTP::Apache;
> 
> sub handler {
>     my $safe_classes = {
>                  Runner => undef,
>              };
>   my $rc = SOAP::Transport::HTTP::Apache->handler($safe_classes);
>     return $rc;
> }
> 
> package Runner;
> use strict;
> 
> sub new {
>     bless {}, shift;
> }
> 
> sub handle_request {
> 
>     print STDERR "-------SOAP HANDLER START -----------\n";
> 
>         my ($self, $headers, $body, $envelopeMaker) = @_;
> 
>     $body->{extra_stuff} = "body extra_stuff";
> 
>     foreach my $header (@$headers) {
>         $header->{extra_stuff} = "header extra_stuff";
>         $envelopeMaker->add_header(undef, undef, 0, 0, $header);
>     }
>     my $rc = $envelopeMaker->set_body(undef, 'myresponse', 0, $body);
>     print STDERR "-------SOAP HANDLER END -----------\n";
> 
>     return $rc;
> }
> 
> 1;
> 
> and here's the response I get:
> 
> HTTP/1.1 400 Bad Request
> Connection: close
> Date: Mon, 27 Sep 2004 14:59:05 GMT
> Server: Apache/1.3.31
> Content-Type: text/html; charset=iso-8859-1
> Client-Date: Mon, 27 Sep 2004 14:59:05 GMT
> Client-Peer: 155.10.37.51:7070
> Client-Response-Num: 1
> Client-Transfer-Encoding: chunked
> Title: 400 Bad Request
> X-Cache: MISS from localhost
> 
> <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
> <HTML><HEAD>
> <TITLE>400 Bad Request</TITLE>
> </HEAD><BODY>
> <H1>Bad Request</H1>
> Your browser sent a request that this server could not understand.<P>
> [libapreq] unknown content-type: `text/xml; charset=utf-8'<P>
> </BODY></HTML>
> 
>  From inspecting SOAP::Lite::Transport::HTTP::Apache, the error is being 
> generated here:
> 
>     my %args = $r->args();
>     unless (exists $args{class}) {
>         return BAD_REQUEST;
>     }
> 
> The %args hash is empty, most likely because libapreq doesn't understand 
> the POST'ed XML data - see the error message above regarding the 
> 'unknown content type.'
> 
> Note that this all works fine if I use the daemon method of writing a 
> SOAP server, but for obvious reasons I want to use mod_perl.
> 
> So, what's the solution to this?  The client wants to send XML data, yet 
> the server is especting to receive posted form data.  I've looked 
> through the docs, but I've yet to find a solution.  From searching the 
> mailing lists, I did find one question that matched this on almost 
> exactly, but there were no responses. 
> 
> Software Versions:
> 
> Perl: 5.6.1
> libapreq: 1.3
> Apache: 1.3.31
> mod_perl: 1.29
> MIME::Lite: 2.117
> 


-- 
Report problems: http://perl.apache.org/bugs/
Mail list info: http://perl.apache.org/maillist/modperl.html
List etiquette: http://perl.apache.org/maillist/email-etiquette.html

Reply via email to