如果我使用wget
从geonames.org服务器检索某些东西,它会报告两个IP地址,第一个失败但是从第二个获取它:
Resolving ws.geonames.org (ws.geonames.org)... 5.9.41.208, 176.9.107.169
Connecting to ws.geonames.org (ws.geonames.org)|5.9.41.208|:80... failed: Connection refused.
Connecting to ws.geonames.org (ws.geonames.org)|176.9.107.169|:80... connected.
HTTP request sent, awaiting response... 200 OK
但不幸的是,我必须使用LWP :: UserAgent和HTTP :: Request通过perl访问它。如果第一个IP失败,如何让他们尝试第二个IP?
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(
GET =>
"http://ws.geonames.org/countrySubdivision?lat=$lat&lng=$long&radius=$radius&username=xyzzy");
my $res = $ua->request($req);
答案 0 :(得分:6)
您可以自己完成:在Net::DNS::Resolver
的帮助下获取所有IP地址,然后尝试所有IP地址,直到获得成功的响应。请注意,如果使用IP地址,则必须自己提供“主机”标头,以防服务器使用基于名称的虚拟主机。
以下几行可能有效。也许甚至还有一个CPAN模块,我没有检查:
use Net::DNS;
use LWP::UserAgent;
my @addrs;
{
my $res = Net::DNS::Resolver->new;
my $query = $res->search("ws.geonames.org");
if ($query) {
for my $rr ($query->answer) {
if ($rr->type eq "A") {
push @addrs, $rr->address;
}
}
} else {
die "DNS query failed: ", $res->errorstring, "\n";
}
}
my $ua = LWP::UserAgent->new;
my $res;
for my $addr (@addrs) {
$res = $ua->get("http://$addr/countrySubdivision?lat=$lat&lng=$long&radius=$radius&username=xyzzy", Host => 'ws.geonames.org');
last if $res->is_success;
}
答案 1 :(得分:1)
Slaven的解决方案是正常的,除非无法直接访问IP地址。 在这种情况下,以下内容适用于我:
local @LWP::Protocol::http::EXTRA_SOCK_OPTS = (
PeerAddr => 'my_hostname',
MultiHomed => 1,
);
my $response = $ua->post('https://my_hostname/...', ...);