2013-09-05 6 views
25

Wenn eine Website den Fehler '503-Service nicht verfügbar' zurückgibt, löst open-uri eine Ausnahme aus. Zum Beispiel:Wie kann ich 503 Fehler mit Open-Uri umgehen?

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

Allerdings, wenn Sie es dann in einem Webbrowser besuchen, zeigt es tatsächlich eine Seite mit einem CAPTCHA und keinem Fehler.

Wie kann ich sicherstellen, dass Open-Uri nicht nur eine Ausnahme auslöst, sondern tatsächlich die Antwort verarbeitet und mir den Seiteninhalt liefert?

Antwort

46

OpenURI::HTTPError haben Sie ein io Attribut, das Sie überprüfen können, um zu bekommen, was Sie wollen. io ist ein StringIO Objekt mit mehreren Singleton auf ihm definierten Methoden (status zum Beispiel):

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  

jedoch für diese Aufgabe das Net::HTTP Modul wahrscheinlich eine bessere Alternative ist:

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

Thank you! Ich habe Ihre Antwort auf die Frage gelesen, bevor Sie sie bearbeitet haben. Ich habe über Ausnahmen gelesen und sie sollten nicht für allgemeine Bedingungen verwendet werden. Wäre es also besser, net/http statt open-uri zu verwenden, weil es bedeutet, dass ich keins verwenden muss? –