18

我正在尝试将参数传递给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 没有设置,我该如何让它工作?

4

3 回答 3

19

在 HTTParty 中,base_uri是一个设置内部选项哈希的类方法。要从您的自定义类方法中动态更改它,login您可以将其作为方法调用(而不是像变量一样分配它)。

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

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

希望能帮助到你。

于 2012-03-08T11:29:05.547 回答
10

我还不能发表评论,所以这是对 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
于 2015-10-28T13:17:00.787 回答
7

我不确定在第一次问这个问题时它是否已实现,但如果您想:base_uri在每个请求或每个实例的基础上设置或覆盖,HTTParty 请求方法(:get、:post 等)接受选项来覆盖类选项。

因此,对于 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,这可能不是您想要的。它当然不是线程安全的。

于 2017-08-23T22:12:24.510 回答