ruby - Come posso gestire gli errori 503 con open-uri?



error-handling (1)

OpenURI::HTTPError ha un attributo io che puoi controllare per ottenere quello che vuoi. io è un oggetto StringIO con diversi metodi singleton definiti su di esso ( status ad esempio):

require 'open-uri'
begin
  open('http://www.google.co.uk/sorry/?continue=http://www.google.co.uk/search%3Fq%3Dhello%26oq%3Dhello%26ie%3DUTF-8')
rescue OpenURI::HTTPError => error
  response = error.io
  response.status
  # => ["503", "Service Unavailable"] 
  response.string
  # => <!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html DIR=\"LTR\">\n<head><meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\"><meta name=\"viewport\" content=\"initial-scale=1\">...
end    

Tuttavia per questa attività il modulo Net::HTTP è probabilmente un'alternativa migliore:

require 'net/http'
response = Net::HTTP.get_response(URI.parse('http://www.google.co.uk/sorry/?continue=http://www.google.co.uk/search%3Fq%3Dhello%26oq%3Dhello%26ie%3DUTF-8'))
response.code
# => "503"
response.body
# => "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html DIR=\"LTR\">\n<head><meta http-equiv=\"content-type\" content=\"text/html; ...

Se un sito web restituisce un errore "503 servizio non disponibile", open-uri genera un'eccezione. Per esempio:

require 'open-uri'
open('http://www.google.co.uk/sorry/?continue=http://www.google.co.uk/search%3Fq%3Dhello%26oq%3Dhello%26ie%3DUTF-8')
# OpenURI::HTTPError: 503 Service Unavailable
# ...

Tuttavia, se lo si visita in un browser Web, in realtà visualizza una pagina con CAPTCHA e non un errore.

Come posso assicurarmi che open-uri non si limita a lanciare questa eccezione, ma in realtà gestisce la risposta e mi fornisce il contenuto della pagina?





open-uri