如何使用httparty切换base_uri

时间:2012-03-08 11:01:44

标签: ruby httparty

我正在尝试将参数传递给login方法,我想根据该参数切换基础uri。

像这样:

class Managementdb
  include HTTParty

  def self.login(game_name)
        case game_name
        when "game1"
            self.base_uri = "http://game1"
        when "game2"
            self.base_uri = "http://game2"
        when "game3"
            self.base_uri = "http://game3"
        end

    response = self.get("/login")

        if response.success?
      @authToken = response["authToken"]
    else
      # this just raises the net/http response that was raised
      raise response.response    
    end
  end

  ...

当我从一个方法调用它时,基础uri没有设置,我该如何让它工作?

3 个答案:

答案 0 :(得分:16)

在HTTParty中,base_uri类方法,它设置内部选项哈希。要从自定义类方法login中动态更改它,您只需将其称为方法(不要将其指定为变量)。

例如,更改上面的代码,这应该按照您的预期设置base_uri

...
case game_name
  when "game1"
    # call it as a method
    self.base_uri "http://game1"
...

希望它有所帮助。

答案 1 :(得分:8)

我还不能发表评论,所以这是Estanislau Trepat答案的延伸。

要为所有通话设置base_uri,请调用相应类方法:

self.base_uri "http://api.yourdomain.com"

如果您想要一种方法只发送几个不同的URI 并避免状态错误(忘记切换回原始URI),您可以使用以下帮助程序:

def self.for_uri(uri)
  current_uri = self.base_uri
  self.base_uri uri
  yield
  self.base_uri current_uri
end

使用上面的帮助程序,您可以对其他URI进行特定调用,如下所示:

for_uri('https://api.anotheruri.com') do
  # your httparty calls to another URI
end

答案 2 :(得分:3)

我不确定它是在第一次提出此问题时实现的,但如果您想在每个请求或每个实例的基础上设置或覆盖:base_uri,则HTTParty请求方法(:get ,:post等)accept options覆盖类选项。

因此,对于OP的例子,它可能看起来像这样:

class Managementdb
  include HTTParty

  # If you wanted a default, class-level base_uri, set it here:
  base_uri "http://games"

  def self.login(game_name)
    base_uri =
      case game_name
      when "game1" then "http://game1"
      when "game2" then "http://game2"
      when "game3" then "http://game3"
      end

    # To override base_uri for an individual request, pass
    # it as an option:
    response = get "/login", base_uri: base_uri

    # ...
  end
end

如某些其他答案中所建议的那样,动态调用类方法会更改所有请求的base_uri,这可能不是您想要的。它当然不是线程安全的。