0

Perl を使用してSOAP::Lite、OTRS と呼ばれるシステムからチケット情報を取得しています。

現在、OTRS に GetTicket という Web サービスをセットアップしています。

SOAP:LiteWeb サービスに接続して、チケット情報を取得することができました。チケット情報はハッシュ参照として返されます。

コード内でハッシュ参照を作成していません。それが返されているだけです。ハッシュ参照を作成していない場合、どうすればそのハッシュ参照を分解できますか?

この時点で、 を使用してハッシュ参照をループしようとしています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そのため、 new を記述してオーバーロードする必要があります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;

1 つのハッシュ値を取得するには:

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

それらをループするには:

foreach my $key (keys %$result) {
     print "$key: " . $result->{$key};
}
于 2012-06-15T19:50:18.810 に答える