根据您的请求的性质(大小、内容、结构对输入的依赖程度),有几种不同的方法可以做到这一点。
最简单的方法是将您的请求存储在程序中的字符串中,放入变量然后发送。
#!/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
hashref 并将其内容放在模板中的各个位置。$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
。