【问题标题】:How to switch base_uri with httparty如何使用 httparty 切换 base_uri
【发布时间】:2012-03-08 11:01:44
【问题描述】:

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

【问题讨论】:

    标签: ruby httparty


    【解决方案1】:

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

    例如,更改上面的代码,这应该像您期望的那样设置base_uri:

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

    希望对你有帮助。

    【讨论】:

    • 如果你需要在你的initialize()方法中调用一个Mixin的类方法,你需要调用YourClassName.mixin_class_method。
    • 在我的 initialize 方法中,我必须调用 self.class.base_uri "http://example.com" 才能使其工作。
    • @hamstar 但这会改变所有实例的 base_uri 吗?所以,所有实例都会像最后一个一样,对吧?
    • 如果您想再次使用原始值的实例,请记住将base_uri 更改回方法调用结束时的原始值。
    【解决方案2】:

    我还不能发表评论,所以这里是对 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
    

    【讨论】:

    • 我非常喜欢这种方法。但是,重要的是不要将 base_uri 作为返回值返回。如果您需要对返回值做一些事情,那将无济于事。为了改善这一点,response = yield 然后将response 作为最后一行以从 httparty 调用返回响应值
    • 我也喜欢这种方法,并使用它......然后又意识到了一件事。如果您的yield 导致异常,那么您的base_uri 将“卡住”应该是临时的base_uri!因此,使用begin/rescue/ensure 块来确保您的self.base_uri 即使在出现异常的情况下也会被恢复是一个好主意。
    【解决方案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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多