我正在寻找一种方法,使用标准Net :: HTTP库为每个GET请求使用不同的IP地址。服务器有5个IP地址,并假设某些API在达到每个IP的请求限制时阻止访问。所以,只有这样做 - 使用另一台服务器。我在ruby docs中找不到任何关于它的东西。
例如,curl允许您将其附加到特定的IP地址(在PHP中):
$req = curl_init($url)
curl_setopt($req, CURLOPT_INTERFACE, 'ip.address.goes.here';
$result = curl_exec($req);
有没有办法用Net :: HTTP库做到这一点?作为替代 - CURB(红宝石卷曲绑定)。但这将是我将尝试的最后一件事。
建议/想法?
附:使用CURB的解决方案(带有脏测试,ip被替换):
require 'rubygems'
require 'curb'
ip_addresses = [
'1.1.1.1',
'2.2.2.2',
'3.3.3.3',
'4.4.4.4',
'5.5.5.5'
]
ip_addresses.each do |address|
url = 'http://www.ip-adress.com/'
c = Curl::Easy.new(url)
c.interface = address
c.perform
ip = c.body_str.scan(/<h2>My IP address is: ([\d\.]{1,})<\/h2>/).first
puts "for #{address} got response: #{ip}"
end
看起来你不能用Net:HTTP做到这一点。这是来源
http://github.com/ruby/ruby/blob/trunk/lib/net/http.rb
第644行是连接打开的位置
s = timeout(@open_timeout) { TCPSocket.open(conn_address(), conn_port()) }
TCPSocket.open的第三个和第四个参数是local_address和local_port,因为它们没有指定,所以不可能。看起来你必须要用路边石。
看起来你不能用Net:HTTP做到这一点。这是来源
http://github.com/ruby/ruby/blob/trunk/lib/net/http.rb
第644行是连接打开的位置
s = timeout(@open_timeout) { TCPSocket.open(conn_address(), conn_port()) }
TCPSocket.open的第三个和第四个参数是local_address和local_port,因为它们没有指定,所以不可能。看起来你必须要用路边石。
我知道这是旧的,但希望其他人发现这很有用,因为我今天需要它。您可以执行以下操作:
http = Net::HTTP.new(uri.host, uri.port)
http.local_host = ip
response = http.request(request)
请注意,我不相信您可以使用Net :: HTTP.start,因为它不接受local_host作为选项。
事实上有一种方法可以做到这一点,如果你猴子补丁TCPSocket:
https://gist.github.com/800214
遏制很棒,但不适用于Jruby,所以我一直在研究替代方案......