如何使用open-uri处理503错误?

Max*_*ins 26 ruby error-handling open-uri

如果网站返回"503 service unavailable"错误,则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
# ...
Run Code Online (Sandbox Code Playgroud)

但是,如果您随后在Web浏览器中访问它,它实际上会显示一个带有CAPTCHA而不是错误的页面.

我如何确保open-uri不仅仅将此作为异常,而是实际处理响应并向我提供页面内容?

tor*_*o2k 49

OpenURI::HTTPError有一个io属性,你可以检查,以获得你想要的.io是一个StringIO在其上定义了几个单例方法的对象(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    
Run Code Online (Sandbox Code Playgroud)

但是对于此任务,该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; ...
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!在您编辑问题之前,我阅读了您对问题的回答,我正在阅读有关异常以及它们不应用于常见条件的信息。那么使用 net/http 而不是 open-uri 会更好,因为这意味着我不必使用一个? (2认同)