Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法将Ruby Net::HTTP请求附加到特定的IP地址/网络接口?_Ruby_Http Request - Fatal编程技术网

有没有办法将Ruby Net::HTTP请求附加到特定的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): 需要

我正在寻找一种方法,使用标准的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 )