【问题标题】:Pull value from hash reference从哈希引用中提取值
【发布时间】:2019-09-12 16:07:44
【问题描述】:

我正在使用 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 您对如何修复 OP 遇到的 AuthFail 错误有任何想法吗?我想不出我很久没用过 Perl 的东西了。
  • 你问题中的代码是乱码。
  • @hobbs 我刚刚注意到我搞砸了几行,让我编辑和修复它。

标签: perl soaplite


【解决方案1】:

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

LWP::UserAgent 的文档是这样说的

[get_basic_credentials] 应该返回用户名和密码。它 应该返回一个空列表以中止身份验证解决方案 试图。子类可以重写这个方法来提示用户 信息。

所以你需要通过写一个新的SOAP::Transport::HTTP::Client::get_basic_credentials来重载LWP::UserAgent::get_basic_credentials

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

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

在您的程序中的任何位置。顶部可能是最整洁的。 (BEGIN 块强制在执行开始之前实现新方法定义,无论其在程序中的位置如何。)

我希望有一个更好的解决方案,因为我对这个解决方案不太满意:它是 Perl 编程的一个丑陋部分。您最好完全继承 SOAP::Lite 以使界面更整洁。

【讨论】:

  • 好的,我现在正在尝试这个,但仍然收到授权错误。对我来说,这看起来像是在返回用户名和密码,这是真的吗?如果没有,我应该输入我的用户名和密码吗?
【解决方案2】:
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};
}

【讨论】:

  • 这正是我们之前对代码所做的事情,但我们仍然收到授权错误。正如我所说,我确实有用户名和密码,只是不确定如何通过 SOAP::Lite 传递这些信息。你对如何做到这一点有任何想法吗?
  • 您询问了如何使用返回的哈希引用。我回答了这个问题。也许你应该编辑你的问题。
  • 实际上,在您发布此答案之前已对其进行了编辑。但感谢您的意见。
猜你喜欢
  • 1970-01-01
  • 2017-05-26
  • 2021-02-20
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
  • 2012-05-28
  • 2019-11-21
相关资源
最近更新 更多