0

我正在使用 Perl 并SOAP::Lite从名为 OTRS 的系统中提取票证信息。

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

我们已成功SOAP:Lite连接到 Web 服务并提取票证信息。票证信息作为哈希参考返回。

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

在这一点上,我们正在尝试使用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...

编辑:添加转储程序并收到授权错误。我们确实有用户名和密码,在这一点上我只是不知道把它放在哪里。

4

2 回答 2

3

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完全继承子类以使界面更整洁。

于 2012-06-15T20:39:03.953 回答
1
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};
}
于 2012-06-15T19:50:18.810 回答