13

我正在寻找一种使用标准 Net::HTTP 库为每个 GET 请求使用不同 IP 地址的方法。服务器有 5 个 IP 地址,并假设某些 API 在达到每个 IP 的请求限制时阻止访问。因此,唯一的方法是使用另一台服务器。我在 ruby​​ 文档中找不到任何关于它的信息。

例如, curl 允许您将其附加到特定的 IP 地址(在 PHP 中):

$req = curl_init($url)
curl_setopt($req, CURLOPT_INTERFACE, 'ip.address.goes.here';
$result = curl_exec($req);

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
4

4 回答 4

8

我知道这很旧,但希望其他人会觉得这很有用,因为我今天需要这个。您可以执行以下操作:

http = Net::HTTP.new(uri.host, uri.port)
http.local_host = ip
response = http.request(request)

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

于 2014-07-22T19:26:47.683 回答
4

事实上,如果你给 TCPSocket 打补丁,有一种方法可以做到这一点:

https://gist.github.com/800214

Curb 很棒,但不适用于 Jruby,所以我一直在寻找替代方案......

于 2011-01-28T16:31:34.233 回答
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()) }

TCPSocket.open 的第三个和第四个参数是 local_address 和 local_port,由于没有指定它们,所以这是不可能的。看起来你必须去路边。

于 2010-06-09T23:46:03.017 回答
-2

当然可以。我做了如下:

# remote_host can be IP or hostname
uri     = URI.parse( "http://" + remote_host )
http    = Net::HTTP.new( uri.host, uri.port )
request = Net::HTTP::Get.new(uri.request_uri)
request.initialize_http_header( { "Host" => domain })
response = http.request( request )
于 2019-01-03T06:19:19.547 回答