2012-03-08 22 views
12

Estoy tratando de pasar un parámetro a un método login y quiero cambiar el uri base basado en ese parámetro.Cómo cambiar base_uri con httparty

así:

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 

    ... 

Base URI no se establece cuando la llamo de un método, ¿cómo consigo que para trabajar?

Respuesta

14

En HTTParty, base_uri es un método de clase que establece un hash de opciones internas. Para cambiarlo dinámicamente desde su método de clase personalizado login, puede llamarlo como método (sin asignarlo como si fuera una variable).

Por ejemplo, cambiar el código de arriba, esto debe establecer base_uri como se esperaba:

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

espero que ayude.

+0

esto parece estar funcionando :) gracias. –

+0

Si necesita llamar a un método de clase de un Mixin en su método initialize(), debe llamar a 'YourClassName.mixin_class_method'. – spier

+19

En mi método 'initialize' tuve que llamar' self.class.base_uri "http://example.com" 'para que funcione. – hamstar

8

No puedo comentar aún, así que aquí hay una extensión de la respuesta de Estanislau Trepat.

Para establecer las base_uri para todas sus llamadas, llame al método de la clase de acuerdo:

self.base_uri "http://api.yourdomain.com" 

Si usted quiere tener una forma de enviar sólo un par de llamadas a un URI diferente y evitar el estado errores (olvidarse de volver a la URI originales), puede utilizar el siguiente ayudante:

def self.for_uri(uri) 
    current_uri = self.base_uri 
    self.base_uri uri 
    yield 
    self.base_uri current_uri 
end 

con el ayudante anterior, puede hacer llamadas específicas a O URI ther como las siguientes:

for_uri('https://api.anotheruri.com') do 
    # your httparty calls to another URI 
end 
+1

Me gusta mucho este enfoque. Sin embargo, es importante que esto no devuelva el 'base_uri' ya que es el valor de retorno. Eso no ayudará si necesita hacer algo con el valor de retorno. Para mejorar esto, 'response = yield' y luego tiene' response' como la última línea para devolver el valor de respuesta de la httparty call – jsookiki

+1

También me gusta este enfoque, y lo utilicé ... y luego me di cuenta de una cosa más.Si tu 'rendimiento 'resulta en una excepción, entonces tu' base_uri' se "atascará" con lo que debería haber sido un 'base_uri' temporal. Así que usar un bloque 'begin/rescue/ensure' para asegurarse de que su' self.base_uri' será restaurado, incluso en el caso de una excepción, es una buena idea. – nicedawg

1

No estoy seguro de que se llevó a cabo cuando se le preguntó por primera vez esta pregunta, pero si desea establecer o anular :base_uri en una base por solicitud o por instancia, petición HTTParty métodos (: get,: post, etc) accept options para anular las opciones de clase.

Así, por ejemplo, de OP, podría ser algo como esto:

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 

Al llamar al método de clase de forma dinámica, como se sugiere en algunas de las otras respuestas, cambia el base_uri para todos solicitudes, que es probablemente no es lo que quieres Ciertamente no es seguro para subprocesos.

Cuestiones relacionadas