从哈希引用中拉取值

时间:2012-06-15 18:58:14

标签: perl soaplite

免责声明:我们之前从未使用过Perl或SOAP :: Lite。请光临我。

违背自己的意愿,我使用Perl和SOAP::Lite从名为OTRS的系统中提取票证信息。

目前我们在OTRS上设置了一个名为GetTicket的Web服务。

我们设法让SOAP:Lite连接到网络服务并提取故障单信息。票证信息以哈希引用的形式返回。

我没有在代码中创建哈希引用,这就是返回的内容。如果我没有创建哈希引用,该如何拆分哈希引用呢?

此时我们正尝试使用foreach遍历哈希引用。我将通过它发布我的进展,但像往常一样,任何建议都表示赞赏。

Perl脚本

#!perl -w

use SOAP::Lite;
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME}=0;

use Data::Dumper;
print Dumper(SOAP::Lite
    -> proxy('https://ost-otrstest.ostusa.com/otrs/nph-genericinterface.pl/Webservice/Test/GetTicket')
    -> GetTicket()
    -> result);

输出

$VAR1 = {
         'ErrorCode' => 'TicketGet.AuthFail'
         'ErrorMessage' => 'TicketGet: Authorization failing!'
        };
Press any key to continue...

编辑:添加了转储程序并收到了授权错误。我们确实有一个用户名和密码,此时我只是不确定放在哪里。谢谢daxim!

2 个答案:

答案 0 :(得分:2)

SOAP::Lite依赖于LWP::UserAgent许多http功能,包括请求授权时的行为。

LWP::UserAgent的文档说明了这个

  

[get_basic_credentials]应该返回用户名和密码。它   应该返回一个空列表以中止身份验证解析   尝试。子类可以覆盖此方法以提示用户   信息。

因此,您需要通过撰写新的LWP::UserAgent::get_basic_credentials来重载SOAP::Transport::HTTP::Client::get_basic_credentials

SOAP::Transport文档中描述了重载此方法。你需要写这个

BEGIN {
  sub SOAP::Transport::HTTP::Client::get_basic_credentials {
    return ('username', 'password');
  }
}

您计划中的任何位置。在顶部可能是最整洁的。 (BEGIN块强制在执行开始之前实现新方法定义,而不管它在程序中的位置。)

我希望有一个更好的解决方案,因为我对这个解决方案不太满意:它是一个丑陋的Perl编程。你可能最好完全将SOAP::Lite子类化,以使界面更整洁。

答案 1 :(得分:0)

my $result = SOAP::Lite
    -> proxy('https://ost-otrstest.ostusa.com/otrs/nph-genericinterface.pl/Webservice/Test/GetTicket')
    -> GetTicket()
    -> result;

获取一个哈希值:

my $errorcode = $result->{ErrorCode}; # TicketGet.AuthFail

循环使用它们:

foreach my $key (keys %$result) {
     print "$key: " . $result->{$key};
}