Como mudar base_uri com httparty
Pergunta
Estou tentando passar um parâmetro para um login
método e quero mudar o uri base com base nesse parâmetro.
Igual a:
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
...
O uri base não é definido quando eu o chamo de um método. Como faço para que isso funcione?
Solução
No HTTParty, base_uri
é um método de classe que define um hash de opções interno.Para alterá-lo dinamicamente de dentro do seu método de classe personalizado login
você pode simplesmente chamá-lo como um método (sem atribuí-lo como se fosse uma variável).
Por exemplo, alterando seu código acima, isso deve definir base_uri
como você espera:
...
case game_name
when "game1"
# call it as a method
self.base_uri "http://game1"
...
Espero que ajude.
Outras dicas
Ainda não posso comentar, então aqui vai uma extensão da resposta de Estanislau Trepat.
Para definir o base_uri
para todas as suas chamadas, chame o método de classe correspondente:
self.base_uri "http://api.yourdomain.com"
Se você quiser ter uma forma de enviar apenas algumas chamadas para um URI diferente e evitar erros de estado (esquecer de voltar ao URI original), você pode usar o seguinte auxiliar:
def self.for_uri(uri)
current_uri = self.base_uri
self.base_uri uri
yield
self.base_uri current_uri
end
Com o auxiliar acima, você pode fazer chamadas específicas para outros URIs como este:
for_uri('https://api.anotheruri.com') do
# your httparty calls to another URI
end
Não tenho certeza se foi implementado quando esta pergunta foi feita pela primeira vez, mas se você quiser definir ou substituir :base_uri
por solicitação ou por instância, métodos de solicitação HTTParty (:get, :post, etc) aceitar opções para substituir as opções de classe.
Então, para o exemplo do OP, poderia ser algo assim:
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
Chamar o método de classe dinamicamente, conforme sugerido em algumas das outras respostas, altera o base_uri para todos solicitações, o que provavelmente não é o que você deseja.Certamente não é seguro para threads.