7

我正在使用 ruby​​ 1.9.3 并尝试使用open-uri获取 url 并尝试使用Net:HTTP

我试图对两者都使用代理身份验证:

尝试通过以下方式POST发出请求net/http

require 'net/http'
require 'open-uri'
http = Net::HTTP.new("google.com", 80)
headers = { 'User-Agent' => 'Ruby 193'}

resp, data = http.post("/", "name1=value1&name2=value2", headers)
puts data

open-uri无法做到这一点,POST我使用:

data = open("http://google.com/","User-Agent"=> "Ruby 193").read

我将如何修改这些以使用具有 HTTP 身份验证的代理

我已经尝试过(对于 open-uri)

data = open("http://google.com/","User-Agent"=> "Ruby 193", :proxy_http_basic_authentication => ["http://proxy.com:8000/", "proxy-user", "proxy-password"]).read

但是,我将得到的只是一个OpenURI::HTTPError: 407 Proxy Authentication Required. 我已经验证了所有内容,它可以在具有相同身份验证和代理详细信息的浏览器中使用,但我无法让 ruby​​ 做到这一点。

我将如何修改上面的代码以正确添加 http 身份验证?有没有人经历过这种暴行?

4

1 回答 1

18

尝试:

require "open-uri"
proxy_uri = URI.parse("http://proxy.com:8000")

data = open("http://www.whatismyipaddress.com/", :proxy_http_basic_authentication => [proxy_uri, "username", "password"]).read
puts data

至于 Net::HTTP,我最近在一个名为http的 Net::HTTP 包装库中实现了对带有 http 身份验证的代理的支持。如果您查看我的最后一个拉取请求,您将看到基本实现。

编辑:希望这会让你朝着正确的方向前进。

Net::HTTP::Proxy(proxy_uri.host, proxy_uri.port,"username","password").start('whatismyipaddress.com') do |http| 
  puts http.get('/').body
end

编辑 2020 年 11 月 24 日Net::HTTP::Proxy现在被认为是过时的。您现在可以在创建新实例时配置代理Net::HTTP。有关详细信息,请参阅Net::HTTP.new的文档。

于 2012-04-06T12:06:33.687 回答