加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 使用Open-URI获取XML以及远程URL无法返回/超时的问题时

发布时间:2020-12-17 03:44:47 所属栏目:百科 来源:网络整理
导读:只要没有远程错误,当前代码就可以工作: 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
只要没有远程错误,当前代码就可以工作:

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,/,css和at,%,at_css,at_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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读