リクエストの性質 (サイズ、コンテンツ、構造が入力にどの程度依存するか) に応じて、これを行うにはいくつかの方法があります。
最も簡単な方法は、リクエストをプログラムの文字列内に格納し、変数を入れてから送信することです。
#!/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
。