有没有办法将Ruby Net::HTTP请求附加到特定的IP地址/网络接口?
我正在寻找一种方法,使用标准的Net::HTTP库为每个GET请求使用不同的IP地址。服务器有5个ip地址,并假设当达到每个ip的请求限制时,某些API正在阻止访问。所以,唯一的方法就是使用另一台服务器。我在ruby文档中找不到关于它的任何信息 例如,curl允许您将其附加到特定的ip地址(在PHP中): 有没有任何方法可以使用Net::HTTP库实现这一点?作为替代方案-加铺(ruby curl绑定)。但这将是我最后一次尝试 建议/想法 注:带路缘石的解决方案(通过肮脏试验,更换ip):有没有办法将Ruby Net::HTTP请求附加到特定的IP地址/网络接口?,ruby,http-request,Ruby,Http Request,我正在寻找一种方法,使用标准的Net::HTTP库为每个GET请求使用不同的IP地址。服务器有5个ip地址,并假设当达到每个ip的请求限制时,某些API正在阻止访问。所以,唯一的方法就是使用另一台服务器。我在ruby文档中找不到关于它的任何信息 例如,curl允许您将其附加到特定的ip地址(在PHP中): 有没有任何方法可以使用Net::HTTP库实现这一点?作为替代方案-加铺(ruby curl绑定)。但这将是我最后一次尝试 建议/想法 注:带路缘石的解决方案(通过肮脏试验,更换ip): 需要
需要“rubygems”
需要“路缘”
ip_地址=[
'1.1.1.1',
'2.2.2.2',
'3.3.3.3',
'4.4.4.4',
'5.5.5.5'
]
ip|U地址。每个do|地址|
url='1〕http://www.ip-adress.com/'
c=Curl::Easy.new(url)
c、 接口=地址
c、 表演
ip=c.body_str.scan(/我的ip地址是:([\d\.]{1,})/)。首先
放置“for#{address}得到响应:#{ip}”
结束
看起来你不能用Net:HTTP完成。这是消息来源
第644行是连接打开的位置
s = timeout(@open_timeout) { TCPSocket.open(conn_address(), conn_port()) }
TCPSocket.open的第三个和第四个参数是local_address和local_port,因为没有指定它们,所以不可能。看起来您必须使用路缘。如果您使用monkey patch TCPSocket,实际上有一种方法可以做到这一点:
路缘棒极了,但无法与Jruby一起使用,所以我一直在寻找替代方案…我知道这已经很旧了,但希望其他人发现这很有用,因为我今天需要它。您可以执行以下操作:
http = Net::HTTP.new(uri.host, uri.port)
http.local_host = ip
response = http.request(request)
请注意,我不相信您可以使用Net::HTTP.start,因为它不接受本地主机作为选项。当然可以。我的做法如下:
# 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 )
是的,我还深入研究了http.rb文件,以发现是否存在任何可能被覆盖的内容。好吧,那太糟糕了,因为我必须重写我的核心请求库。。无论如何,谢谢你的建议:)得到了一个简单的路缘解决方案。将发现性能是否仍然相同。供现在遇到此答案的任何人参考--此问题已修复。未经测试,但看起来您可以执行
x=Net::HTTP.new('google.com');x、 本地主机='10.0.0.1'
。我得到错误号::EADDRNOTAVAIL:无法为“[ip]”端口[port]
分配请求的地址-bind(2)。我也试过设置http.local\u端口,但什么都没有。Ruby 2.6.3
http = Net::HTTP.new(uri.host, uri.port)
http.local_host = ip
response = http.request(request)
# 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 )