2013-09-05 29 views
25

如果网站返回'503服务不可用'错误,则open-uri会引发异常。例如:如何处理503 open-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 
# ... 

但是,如果你再在Web浏览器访问它,它实际上显示了CAPTCHA,而不是一个错误的页面。

我怎样才能确保开放URI不只是把这个作为一个例外,但实际上处理的响应,并为我提供了网页内容?

回答

46

OpenURI::HTTPErrorio属性,你可以检查得到你想要的东西。 ioStringIO物体(status例如)在其上定义了几种特殊方法:

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  

但是此任务的Net::HTTP模块可能是一个更好的选择:

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

谢谢!在您编辑之前,我已阅读了您对该问题的回答,我正在阅读有关例外情况的内容,并且不应将其用于常见情况。那么最好是使用net/http而不是open-uri,因为这意味着我不必使用它。 –