如何修复nil的未定义方法[]:OpenUri中的NilClass

时间:2017-01-28 22:56:42

标签: ruby

我有时会收到错误。这是基本程序:

require 'open-uri'
require 'json'
require 'date'
require 'time'

def update_wu
  open("http://api.wunderground.com/api/.......12.json") {|wu|
    json_string = wu.read

    upd_str = ....
      ...
    wu.close
    return upd_str
  }
  return "NULL"
end

loop do
  upd_str = update_wu

  # every 5 minutes 
  t = Time.now
  secs = (t.hour * 60 + t.min) * 60 + t.sec
  wait = ((secs/(5*60)).to_i + 1) * 5 * 60 - secs
  print "#{Time.now.inspect}  #{upd_str} #{wait}\n"

  sleep(wait)
end

这是错误:

wu.rb:12:in `block in update_wu': undefined method `[]' for nil:NilClass (NoMethodError)
    from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:155:in `open_uri'
    from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:717:in `open'
    from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:35:in `open'
    from wu.rb:8:in `update_wu'

程序每五分钟循环一次,然后进行URI调用。它会在出现错误之前循环几十次。

什么了?

1 个答案:

答案 0 :(得分:1)

这是我每五分钟查看一次网站并解析JSON响应的基本代码:

require 'json'
require 'open-uri'
require 'time'

INTERVAL = 5 * 60

loop do
  data = JSON[open("http://httpbin.org/headers").read]
  puts data

  delay = INTERVAL - (Time.now.to_i % INTERVAL)
  puts "Waiting #{delay} seconds"

  sleep(delay)
end

不要这样做。当你不需要检索结果因为它没有改变时访问网站是非常不礼貌的互联网,并可以让你被禁止。

相反,您应该检查是否需要在请求整个资源之前检索数据。通常我们通过发送HEAD请求并将必要的数据传递给站点来执行此操作,然后将告诉我们数据是否已更改,如果已更改,则我们发出GET或POST。有关详细信息,请参阅RFC

  

HEAD方法与GET相同,只是服务器不能在响应中返回消息体。响应HEAD请求的HTTP头中包含的元信息应该与响应GET请求时发送的信息相同。该方法可用于获得关于请求所暗示的实体的元信息,而无需转移实体主体本身。此方法通常用于测试超文本链接的有效性,可访问性和最近的修改。

如何做到这一点是为了你的想法。那里有很多例子。

如果无法建立连接,您将收到异常。你想拯救它。