我对使用 Ruby 非常陌生,尤其是使用 API,但我一直在尝试让Darksky API工作,但我担心我在使用它时遗漏了一些明显的东西。
这是我所拥有的
require 'darksky'
darksky = Darksky::API.new('my api key')
forecast = darksky.forecast('34.0500', '118.2500')
forecast
当我从命令行运行它时,没有任何反应。我在这里做错了什么?
我对使用 Ruby 非常陌生,尤其是使用 API,但我一直在尝试让Darksky API工作,但我担心我在使用它时遗漏了一些明显的东西。
这是我所拥有的
require 'darksky'
darksky = Darksky::API.new('my api key')
forecast = darksky.forecast('34.0500', '118.2500')
forecast
当我从命令行运行它时,没有任何反应。我在这里做错了什么?
简单地使用forecast
不会做任何事情。puts
您至少需要使用:
puts forecast
或者,看看 Ruby 的 object pretty-printer 是否可以返回更有趣的东西:
require 'pp'
pp forecast
进一步挖掘,我认为他们的 API 不起作用。根据他们的示例,使用有效密钥及其位置样本,以及来自其源站点 Forecast.io 的位置,也返回 nil。
直接从 Forecast.io 的站点使用 REST 接口确实会返回 JSON。JSON 在 Ruby 中很容易使用,所以它是一个很好的方法。
下面是一些测试 API 和 Forecast.io 的 REST 接口的代码:
API_KEY = 'xxxxxxxxxxxxxxxxxxx'
LOCATION = %w[37.8267 -122.423]
require 'darksky'
darksky = Darksky::API.new(API_KEY)
forecast = darksky.forecast(*LOCATION)
forecast # => nil
brief_forecast = darksky.brief_forecast(*LOCATION)
brief_forecast # => nil
require 'json'
require 'httparty'
URL = "https://api.forecast.io/forecast/#{ API_KEY }/37.8267,-122.423"
puts URL
# >> https://api.forecast.io/forecast/xxxxxxxxxxxxxxxxxxx/37.8267,-122.423
puts HTTParty.get(URL).body[0, 80]
# >> {"latitude":37.8267,"longitude":-122.423,"timezone":"America/Los_Angeles","offse
请注意,LOCATION
在37.8267,-122.423
这两种情况下,根据 Forecast.io 网站,这是恶魔岛。另请注意,body
显示的输出是 JSON 字符串。
将返回的 JSON 传递给 Ruby 的 JSON 类,例如:
JSON[returned_json]
将其解析回 Ruby 哈希。使用 OpenURI(因为它带有 Ruby)而不是 HTTParty,并将其传递给 JSON 进行解析,如下所示:
body = open(URL).read
puts JSON[body]