如何在 ruby​​s net/http 中设置代理?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/15792999/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-06 05:52:01  来源:igfitidea点击:

How to set a proxy in rubys net/http?

rubyhttpproxynet-http

提问by ada91

I'm trying to set a proxy and to use it in a simple get request like in the documentation. But I always receive an error! The adress and port are right with open-uri it worked.. it's http://proxy:8080.

我正在尝试设置代理并在文档中这样的简单获取请求中使用它。但我总是收到一个错误!地址和端口与 open-uri 是正确的,它起作用了..它是 http://proxy:8080.

proxy_addr = 'proxy'
proxy_port = 8080

Net::HTTP.new('google.de', nil, proxy_addr, proxy_port).start { |http|
  # always proxy via your.proxy.addr:8080
  Net::HTTP.get('google.de', '')
}

What am I doing wrong? Thanks for all answers!

我究竟做错了什么?感谢所有的答案!

回答by Frambot

Net::HTTP.new('google.de', nil, proxy_addr, proxy_port).start { |http|

This will create an httpobject for you to use in the block. Use that rather than generating new ones each time, here Net::HTTP.get('google.de', '')

这将创建一个http对象供您在块中使用。使用它而不是每次都生成新的,在这里Net::HTTP.get('google.de', '')

proxy_addr = 'proxy'
proxy_port = 8080

Net::HTTP.new('google.de', nil, proxy_addr, proxy_port).start { |http|
  # always proxy via your.proxy.addr:8080
  http.get('google.de', '')
}

回答by Mihail Davydenkov

There is another option:

还有另一种选择:

Net::HTTP will automatically create a proxy from the http_proxyenvironment variable if it is present.

http_proxy如果环境变量存在,Net::HTTP 将自动从环境变量创建代理。

So you can use

所以你可以使用

ENV['http_proxy'] = 'http://172.16.3.160:4226' # your http://address:port here

and Net::HTTP will use it for all requests by default.

默认情况下,Net::HTTP 将对所有请求使用它。

It can be helpful for net_http requests in third-party libraries (for example it works for gem gibbonfor MailChimp).

它可以是在第三方库net_http请求(例如,它适用于创业板有帮助长臂猿MailChimp)。

Pass nilfor the proxy address to disable default http_proxy.

通过nil为代理地址禁用默认http_proxy

回答by machzqcq

Here is the code that works if you are making a REST api call behind a proxy:

如果您在代理后面进行 REST api 调用,以下是有效的代码:

require "uri"
require 'net/http'

proxy_host = '<proxy addr>'
proxy_port = '<proxy_port'
proxy_user = '<username>'
proxy_pass = '<password>'

uri = URI.parse("https://saucelabs.com:80/rest/v1/users/<username>")
proxy = Net::HTTP::Proxy(proxy_host, proxy_port, proxy_user, proxy_pass)

req = Net::HTTP::Get.new(uri.path)
req.basic_auth(<sauce_username>,<sauce_password>)

result = proxy.start(uri.host,uri.port) do |http|
http.request(req)
end

puts result.body

回答by mimvp

#!/usr/bin/env ruby
#

require 'rubygems' 
require 'net/http' 
require 'open-uri' 
require 'timeout' 


mimvp_url = "http://proxy.mimvp.com/exist.php"
mimvp_url2 = "https://proxy.mimvp.com/exist.php"
mimvp_url3 = "https://apps.bdimg.com/libs/jquery-i18n/1.1.1/jquery.i18n.min.js"

$proxy = '183.222.102.95:8080'

$proxy_addr = $proxy.split(':')[0].strip
$proxy_port = $proxy.split(':')[1].strip

puts $proxy_addr
puts $proxy_port


begin 
  Timeout.timeout(30) {

    # mimvp_url = http://proxy.mimvp.com/exist.php
    # uri.host = proxy.mimvp.com
    # uri.port = 80
    # uri.path = /exist.php
    uri = URI.parse(mimvp_url)
    result = Net::HTTP.new(uri.host, nil, $proxy_addr, $proxy_port).start { |http|
      http.get(uri.path)
    }
    puts result.body


    # mimvp_url = http://proxy.mimvp.com/exist.php
    # uri.host = proxy.mimvp.com
    # uri.port = 80
    # uri.path = /exist.php
    # req = #<Net::HTTP::Get:0x007fafa594ff78>
    uri = URI.parse(mimvp_url)
    req = Net::HTTP::Get.new(uri.path)
    result = Net::HTTP::Proxy($proxy_addr, $proxy_port).start(uri.host, uri.port) {|http| 
      http.request(req)
    } 
    puts result.body


    # proxy auth (NO TEST)
    $proxy_addr = '<proxy addr>'
    $proxy_port = '<proxy_port'
    $proxy_user = '<username>'                # 代理用户名
    $proxy_pass = '<password>'                # 代理密码

    $website_username = '<website_username>'  # 目标网站登录用户名
    $website_password = '<website_password>'  # 目标网站登录密码

    uri = URI.parse(mimvp_url)
    req = Net::HTTP::Get.new(uri.path)
    req.basic_auth($website_username, $website_password)

    result = Net::HTTP::Proxy($proxy_addr, $proxy_port, $proxy_user, $proxy_pass).start(uri.host, uri.port) {|http| 
      http.request(req)
    } 
    puts result.body

}
rescue => e  
    puts e.inspect  
    exit  
end