如果远程URL没有返回/超时问题,使用Open-URI获取XML和最佳实践?

只要没有远程错误,当前代码就可以工作:

def get_name_from_remote_url cstr = "http://someurl.com" getresult = open(cstr, "UserAgent" => "Ruby-OpenURI").read doc = Nokogiri::XML(getresult) my_data = doc.xpath("/session/name").text # => 'Fred' or 'Sam' etc return my_data end 

但是,如果远程URL超时或什么都不返回怎么办? 例如,我如何检测到并返回nil?

而且,Open-URI是否提供了一种方法来定义在放弃之前等待多长时间? 当用户等待响应时调用此方法,那么我们如何在放弃之前设置最大timeoput时间并告诉用户“抱歉我们尝试访问的远程服务器现在不可用”?

Open-URI很方便,但这种易用性意味着它们可以删除对Net :: HTTP允许的其他HTTP客户端的许多配置细节的访问。

这取决于您使用的Ruby版本。 对于1.8.7,您可以使用Timeout模块。 来自文档:

 require 'timeout' begin status = Timeout::timeout(5) { getresult = open(cstr, "UserAgent" => "Ruby-OpenURI").read } rescue Timeout::Error => e puts e.to_s end 

然后检查getresult的长度,看看你是否有任何内容:

 if (getresult.empty?) puts "got nothing from url" end 

如果您使用的是Ruby 1.9.2,则可以在open()方法中添加:read_timeout => 10选项。


此外,您的代码可以收紧并使其更加灵活。 这将允许您传入URL或默认为当前使用的URL。 另请阅读Nokogiri的NodeSet文档,了解xpath/cssat%at_cssat_xpath

 def get_name_from_remote_url(cstr = 'http://someurl.com') doc = Nokogiri::XML(open(cstr, 'UserAgent' => 'Ruby-OpenURI')) # xpath returns a nodeset which has to be iterated over # my_data = doc.xpath('/session/name').text # => 'Fred' or 'Sam' etc # at returns a single node doc.at('/session/name').text end