Move from SOAP::Lite to XML::Compile::SOAP
So here's my SOAP::Lite
code
#!/usr/bin/perl
use 5.006;
use strict;
use warnings;
use SOAP::Lite +trace => [ 'debug' ];
my $req1 = SOAP::Lite->new(
readable => 1,
autotype => 0,
proxy => 'https://ics2wstest.ic3.com/commerce/1.x/transactionProcessor',
);
$req1->requestMessage(
\SOAP::Data->new(
name => 'item',
attr => { foo => '0' },
value => \SOAP::Data->new(
name => 'foo',
value => 1,
),
),
);
It generates this XML
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns开发者_高级运维:xsd="http://www.w3.org/2001/XMLSchema"
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<requestMessage>
<c-gensym9>
<item foo="0">
<foo>1</foo>
</item>
</c-gensym9>
</requestMessage>
</soap:Body>
</soap:Envelope>
How can I generate the same thing (without the gensym's) using XML::Compile::SOAP
?
Try
cpan BERLE/SOAP-Simple-0.00_03.tar.gz
then
#!/usr/bin/perl --
use strict; use warnings;
use Data::Dumper;
use SOAP::Simple;
my $wsdlfile = '...';
my $soap = SOAP::Simple->new($wsdlfile);
print Dumper(
$soap->requestMessage(
item => [
{ foo => 1 },
],
)
);
or see http://cpansearch.perl.org/src/MARKOV/XML-Compile-SOAP-2.24/t/53wsdlrpclit.t and copy http://cpansearch.perl.org/src/MARKOV/XML-Compile-SOAP-2.24/t/examples/rpc-literal/element.pl and use
schema2example -s element.wsdl -s type.wsdl -x requestMessage.xml
to generate a %request for element.pl, so in the end you end up with something like
#!/usr/bin/perl
use warnings;
use strict;
# general debugging of XML::Compile modules
#~ use Log::Report mode => 3;
# Data::Dumper is your friend in understanding the answer
use Data::Dumper;
$Data::Dumper::Indent = 1;
# The features we use
use XML::Compile::WSDL11;
use XML::Compile::SOAP11;
use XML::Compile::Transport::SOAPHTTP; # we fake an HTTP server
#
# During initiation 'compile time'
#
my $wsdl = XML::Compile::WSDL11->new('element.wsdl');
my $call = $wsdl->compileClient('using_element'
#~ , transport_hook => \&fake_server # hook simulates a remote server at test
);
#
# Reuse often at 'run time'
#
my %request =
( item =>
[ { foo => 1}
]
);
my $answer = $call->( requestMessage => \%request);
# Useful for debugging. Also useful to report to syslog
# my ($answer, $trace) = $call->(\%request);
# $trace->printTimings;
# When you do not know how the answer is structured
#print Dumper $answer;
if($answer->{Fault})
{ print "Oops\n";
}
else
{ print "*** RESULT=$answer->{answer_via_element}{result}\n";
}
exit 0;
Once you're generating the xml you want, try it live
精彩评论