0

作为 Perl 和 XML 的新手..任何人都可以指导我执行以下操作:我必须编写一个应该执行的 Perl 代码:

  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 是一个 no..我哪里出错了?

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>

它采用$varshashref 并将其内容放在模板中的各个位置。$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 回答