Как переключить base_uri с помощью httparty - PullRequest
16 голосов
/ 08 марта 2012

Я пытаюсь передать параметр в метод 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 ]

17 голосов
/ 08 марта 2012

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

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

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

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

8 голосов
/ 28 октября 2015

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

Чтобы установить 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
4 голосов
/ 24 августа 2017

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

...