2013-09-05 12 views
25

Jeśli witryna zwraca błąd "Usługa niedostępna 503", wówczas open-uri zgłasza wyjątek. Na przykład:Jak mogę obsługiwać błędy 503 przy otwartej uri?

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 
# ... 

Jeśli jednak przejdziesz do niego w przeglądarce, wyświetli się strona z CAPTCHA, a nie błąd.

Jak mogę się upewnić, że open-uri nie rzuca tego jako wyjątku, ale faktycznie obsługuje odpowiedź i dostarcza mi zawartości strony?

Odpowiedz

46

OpenURI::HTTPError ma atrybut io, który można sprawdzić, aby uzyskać to, co chcesz. io jest StringIO obiekt z kilku metod pojedynczych określonych na nim (status na przykład):

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  

Jednak do tego celu moduł Net::HTTP jest prawdopodobnie lepsza alternatywa:

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; ... 
+1

Dziękujemy! Przeczytałem twoją odpowiedź na to pytanie, zanim je zredagowałeś, czytałem o wyjątkach i nie powinny one być używane dla zwykłych warunków. Czy byłoby lepiej użyć net/http zamiast open-uri, ponieważ oznacza to, że nie muszę go używać? –

Powiązane problemy