如何重构 ruby rest-client get 方法

How to refactor ruby rest-client get method

我正在使用 Rubys rest-client gem 调用 Google API 并希望缩短 url 部分。

当前代码:

class GoogleTimezoneGetter

  def initialize(lat:, lon:)
    @lat = lat
    @lon = lon
    @time_stamp = Time.new.to_i
  end

  def response
    response = RestClient.get "https://maps.googleapis.com/maps/api/timezone/json?location=#{@lat},#{@lon}&timestamp=#{@time_stamp}&key=#{GOOGLE_TIME_ZONE_KEY}"
    JSON.parse(response)
  end

  def time_zone
    response["timeZoneId"]
  end

end

我希望能够做类似的事情:

def response
    response = RestClient.get (uri, params) 
    JSON.parse(response)
end 

但我正在努力寻找如何做到这一点。

为了使 class 更简洁一些,我想将 url 分解为 'uri' 和 'params'。我认为 rest-client gem 允许你这样做,但我找不到具体的例子。

我想把 {@lat},#{@lon}&timestamp=#{@time_stamp}&key=#{GOOGLE_TIME_ZONE_KEY}" 进入 'params' 方法并将其传递给 RestClient.get 方法。

rest-client 已经接受参数的散列。如果您更喜欢 class 上的一堆小方法,您可以将每个步骤划分为一个方法并保持所有内容的可读性。

class GoogleTimezoneGetter

  def initialize(lat:, lon:)
    @lat = lat
    @lon = lon
    @time_stamp = Time.new.to_i
  end

  def response
    response = RestClient.get gtz_url, params: { gtz_params }
    JSON.parse(response)
  end

  def time_zone
    response["timeZoneId"]
  end

  def gtz_url
    "https://maps.googleapis.com/maps/api/timezone/json"
  end

  def gtz_params
    return {location: "#{@lat},#{@lon}", timestamp: @time_stamp, key: GOOGLE_TIME_ZONE_KEY }
  end
end

你检查过rest-clientgemreadme了吗?

他们确实给出了一个具体的例子(下面的例子引用自自述文件)

RestClient.get 'http://example.com/resource', {params: {id: 50, 'foo' => 'bar'}}

你的情况应该是这样的

def url
  "https://maps.googleapis.com/maps/api/timezone/json"
end

def params
  {
    locations: "#{@lat},#{@lon}",
    timestamp: @time_stamp,
    key: GOOGLE_TIME_ZONE_KEY
  }
end

def response
  response = RestClient.get(url, params: params)
  JSON.parse(response)
end