有没有办法将Ruby Net :: HTTP请求附加到特定的IP地址/网络接口?

Dan*_*off 12 ruby http-request

我正在寻找一种方法,使用标准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);
Run Code Online (Sandbox Code Playgroud)

有没有办法用Net :: HTTP库做到这一点?作为替代 - CURB(红宝石卷曲绑定).但这将是我将尝试的最后一件事.

建议/想法?

PS使用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
Run Code Online (Sandbox Code Playgroud)

小智 8

我知道这是旧的,但希望其他人认为这很有用,因为我今天需要这个.您可以执行以下操作:

http = Net::HTTP.new(uri.host, uri.port)
http.local_host = ip
response = http.request(request)
Run Code Online (Sandbox Code Playgroud)

请注意,我不相信您可以使用Net :: HTTP.start,因为它不接受local_host作为选项.


zai*_*ius 1

看起来你不能用 Net:HTTP 来做到这一点。这是来源

http://github.com/ruby/ruby/blob/trunk/lib/net/http.rb

644行是打开连接的地方

  s = timeout(@open_timeout) { TCPSocket.open(conn_address(), conn_port()) }
Run Code Online (Sandbox Code Playgroud)

TCPSocket.open 的第三个和第四个参数是 local_address 和 local_port,由于未指定它们,所以这是不可能的。看来你得走路边了。

  • 仅供现在遇到这个答案的任何人参考——这个问题已经解决了。未经测试,但看起来您可以执行 `x = Net::HTTP.new('google.com'); x.local_host = '10.0.0.1'`。 (7认同)