代码之家  ›  专栏  ›  技术社区  ›  gib

Perl中的SOAP客户端

  •  0
  • gib  · 技术社区  · 8 年前

    我想和你“交谈” https://webapi.allegro.pl.webapisandbox.pl/service.php?wsdl 使用Perl和SOAP::Lite。

    在PHP中,它非常简单:

    <?
    $client = new SoapClient('https://webapi.allegro.pl.webapisandbox.pl/service.php?wsdl');
    $results = $client->doQueryAllSysStatus(array(
        'countryId' => 1,
        'webapiKey' => 'XXXXXX'
    ));
    header('Content-type: text/plain');
    var_dump($results);
    ?>
    

    但是使用Perl。。。不是;)。

    我写道:

    use SOAP::Lite;
    my $soap = SOAP::Lite->new(proxy => 'https://webapi.allegro.pl.webapisandbox.pl/service.php?wsdl');
    my $som = $soap->call('doQueryAllSysStatus', 1, 'XXXXXX');
    # tried also this:
    # my $som = $soap->call('doQueryAllSysStatus', 
    #     SOAP::Data->name('countryId')->value(1),
    #     SOAP::Data->name('webapiKey')->value('XXXXXX')
    # );
    die $som->faultstring if ($som->fault);
    print $som->result, "\n";
    

    $som->result 为空。

    还尝试了:

    use SOAP::Lite;
    my $soap = SOAP::Lite->service('https://webapi.allegro.pl.webapisandbox.pl/service.php?wsdl');
    my $r = $soap->doQueryAllSysStatus(1, 'xxxxxx');
    print $r, "\n";
    

    。。。得到了 Use of uninitialized value $r in print

    任何帮助都将不胜感激。。。

    更新#1: PHP代码输出:

    object(stdClass)#2 (1) {
      ["sysCountryStatus"]=>
      object(stdClass)#3 (1) {
        ["item"]=>
        object(stdClass)#4 (8) {
          ["countryId"]=>
          int(1)
          ["programVersion"]=>
          string(3) "1.0"
          ["catsVersion"]=>
          string(6) "1.4.94"
          ["apiVersion"]=>
          string(3) "1.0"
          ["attribVersion"]=>
          string(3) "1.0"
          ["formSellVersion"]=>
          string(7) "1.11.91"
          ["siteVersion"]=>
          string(3) "1.0"
          ["verKey"]=>
          int(1505223106)
        }
      }
    }
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   gib    8 年前

    我找到了一个有效的解决方案,所以对于任何好奇的人来说,它就在这里。

    我放弃了 SOAP::Lite 并已使用 XML::Compile::* 模块提供了一些帮助 HTTP::Tiny

    代码:

    use Data::Printer;
    use HTTP::Tiny;
    use XML::Compile::SOAP11;
    use XML::Compile::WSDL11;
    use XML::Compile::Transport::SOAPHTTP;
    
    my $wsdlXml = HTTP::Tiny->new->get('https://....')->{content};
    my $wsdl    = XML::Compile::WSDL11->new($wsdlXml);
    
    my $response = $wsdl->compileCall('doQueryAllSysStatus')->(
        countryId => 1, 
        webapiKey => 'xxxxxx'
    );
    p $response;
    

    打印出:

    \ {
        parameters   {
            sysCountryStatus   {
                item   [
                    [0] {
                        apiVersion        1.0,
                        attribVersion     1.0,
                        catsVersion       "1.4.94",
                        countryId         1,
                        formSellVersion   "1.11.91",
                        programVersion    1.0,
                        siteVersion       1.0,
                        verKey            1505223106
                    }
                ]
            }
        }
    }
    

    耶!;)

        2
  •  0
  •   Ed Dunn    8 年前

    我没有web api密钥,因此无法进行全面测试,但像这样的东西怎么样?

    #!/usr/bin/perl
    
    use warnings;
    use strict;
    use SOAP::Lite;
    
    my $soap = SOAP::Lite->new( proxy => 'https://webapi.allegro.pl.webapisandbox.pl/service.php?wsdl');
    
    my $country = 1;
    my $api = 'XXXXX';
    
    my $r = $soap->doQueryAllSysStatus($country,$api);
    
    print $r->result, "\n";
    

    ---更新---

    #!/usr/bin/perl
    
    use warnings;
    use strict;
    use SOAP::Lite;
    use Data::Dumper;
    
    my $soap = SOAP::Lite->new( proxy => 'https://webapi.allegro.pl.webapisandbox.pl/service.php?wsdl');
    
    my $country = 1;
    my $api = 'XXXXX';
    
    my @r = $soap->doQueryAllSysStatus($country,$api);
    
    print Dumper(\@r);