Вопрос

Я пытаюсь передать параметр в 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 не устанавливается, когда я вызываю его из метода, как мне заставить это работать?

Это было полезно?

Решение

В HTTParty base_uri это метод класса который устанавливает внутренний хэш опций.Чтобы динамически изменить его из вашего метода пользовательского класса login вы можете просто вызвать его как метод (не назначая его, как если бы это была переменная).

Например, изменив приведенный выше код, это должно установить base_uri как вы ожидаете:

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

Надеюсь, поможет.

Другие советы

Я пока не могу комментировать, поэтому вот продолжение ответа Эстанислава Трепата.

Чтобы установить 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 для каждого запроса или для каждого экземпляра методы запроса 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 на все запросы, что, вероятно, не то, что вам нужно.Это, конечно, не потокобезопасно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top