【问题标题】:Move from SOAP::Lite to XML::Compile::SOAP从 SOAP::Lite 迁移到 XML::Compile::SOAP
【发布时间】:2011-08-18 19:44:49
【问题描述】:

这是我的SOAP::Lite 代码

#!/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,
        ),
     ),
);

它生成这个 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>

如何使用XML::Compile::SOAP 生成相同的东西(没有 gensym)?

【问题讨论】:

    标签: xml perl soap


    【解决方案1】:

    试试

    cpan BERLE/SOAP-Simple-0.00_03.tar.gz
    

    然后

    #!/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  },
            ],
        )
    );
    


    或查看http://cpansearch.perl.org/src/MARKOV/XML-Compile-SOAP-2.24/t/53wsdlrpclit.t 并复制http://cpansearch.perl.org/src/MARKOV/XML-Compile-SOAP-2.24/t/examples/rpc-literal/element.pl 并使用
    schema2example -s element.wsdl -s type.wsdl -x requestMessage.xml
    

    为 element.pl 生成一个 %request,所以最后你会得到类似的东西

    #!/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;
    

    生成所需的 xml 后,现场试用

    【讨论】:

    • 这个例子缺少 foo="0" 属性
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    相关资源
    最近更新 更多