Senarai proksi hanya berguna apabila setiap percubaan mencipta klien yang dikonfigurasikan untuk titik akhir itu. Untuk GET melalui proksi HTTP tanpa pengesahan, Net::HTTP boleh digunakan seperti ini:

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
end

Argumen keempat memilih port proksi; uri.host dan uri.port masih menandakan destinasi. Isi kedua-dua entri contoh daripada senarai proksi HTTP apabila memeriksa URL awam yang dibenarkan melalui titik akhir HTTP tanpa pengesahan. request_uri mengekalkan laluan dan pertanyaannya. Contoh ini mengendalikan kegagalan sambungan dan bacaan biasa serta merekodkan status HTTP apabila ia tiba.

Di sini sebarang respons 2xx menamatkan carian. Jika operasi anda menjangkakan hasil lain, takrifkan kriteria itu secara eksplisit. Ubah hala tidak membuktikan secara automatik bahawa halaman yang dikehendaki telah diambil.

Kekalkan pengulangan automatik yang sesuai dengan kaedah. POST yang tamat masa selepas badannya dihantar mungkin sudah mengubah aplikasi jauh; mencubanya semula melalui proksi lain boleh mengulangi kesan itu. Contoh GET tidak menjanjikan main semula yang selamat bagi transaksi sewenang-wenangnya.

Artikel berkaitan