Prøv proxykandidater med separate Ruby Net::HTTP-klienter
Opprett én Net::HTTP-instans per proxykandidat og stopp etter svaret operasjonen din faktisk trenger.
En liste med proxyer blir først nyttig når hvert forsøk oppretter en klient som er konfigurert for det endepunktet. For et GET gjennom HTTP-proxyer uten autentisering kan Net::HTTP brukes slik:
require 'net/http'
uri = URI('https://www.example.com/status')
proxies = ['http://proxy-a.example:8080',
'http://proxy-b.example:8080']
proxies.each do |value|
proxy = URI(value)
http = Net::HTTP.new(uri.host, uri.port, proxy.host, proxy.port)
http.use_ssl = uri.scheme == 'https'
http.open_timeout = 5
http.read_timeout = 10
begin
response = http.get(uri.request_uri)
puts "#{proxy.host}:#{proxy.port} #{response.code}"
break if response.is_a?(Net::HTTPSuccess)
rescue Net::OpenTimeout, Net::ReadTimeout, SocketError, SystemCallError, IOError => error
warn "#{proxy.host}:#{proxy.port} #{error.class}"
end
endDet fjerde argumentet velger proxyporten; uri.host og uri.port angir fortsatt målet. Fyll ut de to eksempeloppføringene fra HTTP-proxylisten når du sjekker en tillatt offentlig URL gjennom HTTP-endepunkter uten autentisering. request_uri beholder banen og spørringen sin. Eksempelet håndterer vanlige tilkoblings- og lesefeil og registrerer en HTTP-status når en kommer.
Her avslutter ethvert 2xx-svar søket. Hvis operasjonen din forventer et annet resultat, må du definere det kriteriet eksplisitt. En omdirigering beviser ikke automatisk at den ønskede siden ble hentet.
Hold automatisk gjentakelse passende for metoden. Et POST som tidsavbrytes etter at kroppen er sendt, kan allerede ha endret fjernapplikasjonen; et nytt forsøk gjennom en annen proxy kan gjenta den effekten. GET-eksempelet lover ikke sikker gjenavspilling av vilkårlige transaksjoner.