ruby - ¿Cómo puedo manejar los errores 503 con open-uri?
error-handling (1)
Si un sitio web devuelve un error ''503 servicio no disponible'', open-uri lanza una excepción. Por ejemplo:
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
# ...
Sin embargo, si luego lo visita en un navegador web, en realidad muestra una página con un CAPTCHA y no un error.
¿Cómo puedo asegurarme de que open-uri no solo lance esto como una excepción sino que realmente maneje la respuesta y me proporcione el contenido de la página?
OpenURI::HTTPError
tiene un atributo io
que puede inspeccionar para obtener lo que desea. io
es un objeto StringIO
con varios métodos singleton definidos en él ( status
por ejemplo):
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
Sin embargo, para esta tarea, el módulo Net::HTTP
es probablemente una mejor alternativa:
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; ...