免责声明:我们之前从未使用过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!
答案 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};
}