首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用Open-URI获取XML,以及在远程url不返回/超时的情况下的最佳实践?

使用Open-URI获取XML,以及在远程url不返回/超时的情况下的最佳实践?
EN

Stack Overflow用户
提问于 2011-02-11 07:44:31
回答 1查看 5.4K关注 0票数 4

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

代码语言:javascript
代码运行次数:0
运行
复制
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时间呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-11 14:30:57

Open-URI很方便,但它的易用性意味着它们不能访问其他HTTP客户端所允许的大量配置细节。

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

代码语言:javascript
代码运行次数:0
运行
复制
require 'timeout'
begin
status = Timeout::timeout(5) {
  getresult = open(cstr, "UserAgent" => "Ruby-OpenURI").read
}
rescue Timeout::Error => e
  puts e.to_s
end

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

代码语言:javascript
代码运行次数:0
运行
复制
if (getresult.empty?)
  puts "got nothing from url"
end

如果你使用的是Ruby1.9.2,你可以在open()方法中添加一个:read_timeout => 10选项。

此外,您的代码可以更紧凑,并使其更加灵活。这将允许您传入URL或默认到当前使用的URL。还可以阅读诺基亚的NodeSet文档,了解xpath/cssat%at_cssat_xpath之间的区别

代码语言:javascript
代码运行次数:0
运行
复制
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
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4964044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档