Как переключить base_uri с помощью 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 не устанавливается, когда я вызываю его из метода, как мне заставить это работать?
Решение
В 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 на все запросы, что, вероятно, не то, что вам нужно.Это, конечно, не потокобезопасно.