0

Perl と XML が初めてなので、次のことを行うために誰かが私を導くことができますか:

  1. 接続します。

  2. connectionId である接続の応答を取得し、それを変数に格納します。

  3. 接続を閉じる

入力:

XML リクエストを投稿する必要があります。リクエスト タイプは http です。

私が持っている XML の構文。

上記の要件を満たすために従うべき手順を教えてください。

前もって感謝します

コードの追加:

use LWP::UserAgent;
use HTTP::Request::Common;
# The xml_request
my $xml_req = "<?xml version=1.0 encoding UTF-8?>
            <!ELEMENT drl (openconnection)>
            <!ATTLIST drl
             mode normal
             connectionid null
            >
            <!ELEMENT openconnection EMPTY>
            <!ATTLIST openconnection
            username admin
            password admin
            ></drl>";
my $ua = LWP::UserAgent->new();
my $response = $ua->post("http://XX.X.X.X:XXXX/lab/v1_2/connection/openConnectionRequest.dtd", Content => $xml_req);

出力はハッシュですが、それが返され、id が返されない場合、どこが間違っているのでしょうか?

4

1 に答える 1

1

リクエストの性質 (サイズ、コンテンツ、構造が入力にどの程度依存するか) に応じて、これを行うにはいくつかの方法があります。

最も簡単な方法は、リクエストをプログラムの文字列内に格納し、変数を入れてから送信することです。

#!/usr/bin/perl
use strict; use warnings;
use LWP::UserAgent;

my ($param1, $param2) = (1, 2);

my $xml = <<XMLREQUEST
<request>
  <param1>$param1</param1>
  <param2>$param2</param2>
</request>
XMLREQUEST
;

my $ua = LWP::UserAgent->new;
my $response = $ua->post('http://www.yourdomain.com/', Content => $xml);
if ($response->is_success) {
  print $response->decoded_content;  # or whatever
}
else {
  die $response->status_line;
}

この場合、LWP::UserAgent送信/受信を行うために使用しています。

次のステップは、テンプレート エンジンを使用することです。Text::Templateそれを行うために使用することができます。サンプルコードは次のようになります。

#!/usr/bin/perl
use strict; use warnings;
use LWP::UserAgent;
use Text::Template;

my $vars = {
  'username' => 'jon',
  'password' => 'verysecure',
  'param1' => {
    'content' => 'a lot of content for param1',
    'foo'     => 'fofofofooo',
  },
  'param2' => {
    'content' => 'even more of content for param2',
    'bar'     => 'bar bar bar',
  },
  'param3' => {
    'content' => 'some content for param3',
  },
};

my $template = Text::Template->new(TYPE => 'FILEHANDLE', SOURCE => \*DATA );
my $xml = $template->fill_in(HASH => $vars);  

my $ua = LWP::UserAgent->new;
my $response = $ua->post('http://www.yourdomain.com/', Content => $xml);
if ($response->is_success) {
  print $response->decoded_content;  # or whatever
}
else {
  die $response->status_line;
}

__DATA__
<request>
  <auth>
    <username>{$username}</username>
    <password>{$password}</password>
  </auth>
  <param1 foo="{$param1{'foo'}}">{$param1{'content'}}</param1>
  <param2 bar="{$param2{'bar'}}">{$param2{'content'}}</param2>
  <param3>{$param3{'content'}}</param3>
</request>

ハッシュリファレンスを受け取り、$varsその内容をテンプレートのそれぞれの場所に置きます。$var->{'username'}テンプレートが言うところに記入されています{$username}。この場合のテンプレートはDATA、プログラムの下に指定されているセクションから読み取られます。必要な要求の種類ごとにテンプレート ファイルを作成することをお勧めします。リクエストにオプションの要素が含まれている場合は、Text::Template条件付きステートメント (テンプレートに Perl コードを入れる) でこれを処理できます。

より動的なアプローチを好む場合はXML::Simple、簡単なタスクを検討してください。XML::Simpleこれは最適な XML モジュールではないことに注意してください。のようXML::Twigに、より堅牢なものもあります。

#!/usr/bin/perl
use strict; use warnings;
use LWP::UserAgent;
use XML::Simple;

my $xmlHash = {
  'request' => {
    'auth' => [ 
      {
        'username' => 'jon', 
      },
      {
        'password' => 'verysecure',
      },
    ],
    'param1' => {
      'content' => 'a lot of content for param1',
      'foo'     => 'fofofofooo',
    },
    'param2' => {
      'content' => 'even more of content for param2',
      'bar'     => 'bar bar bar',
    },
    'param3' => {
      'content' => 'some content for param3',
    },
  }
};

my $xml = XMLout($xmlHash, KeepRoot => 1);  

my $ua = LWP::UserAgent->new;
my $response = $ua->post('http://www.yourdomain.com/', Content => $xml);
if ($response->is_success) {
  print $response->decoded_content;  # or whatever
}
else {
  die $response->status_line;
}

XML::Simple時々少し奇妙なので、 のドキュメントをよく読んでください。

XMLでもあるリクエストの返信を解析したい場合はXML::Simple、そのためにも使用できます。ここXMLin()でトリックを行います。


実装したい非常に複雑な Web サービスがある場合は、SOAP::Liteまたは (大きな WSDL ファイルがある場合) を参照してくださいSOAP::WSDL

于 2012-07-13T07:44:08.857 に答える